こんにちは、たねやつです。
現在家で使っている赤外線送受信装置がIRKitというものなのですが、送受信のたびにLEDがチカチカしたり、夜中に謎の再起動のようなものが発生して眩しい!ので数年使用した今、新しいものに変えようと思います。
Amazonなどで見ていると2000円ちょっとでこんなものがありました。これでも少し値上げしているようです。ネットで見ても参考となるような情報がわんさかありましたので乗り換えてみようと思います。
JFA Broadlinkブラックビーン スマートホームWifi赤外線リモコン [並行輸入品]
- 出版社/メーカー: Broadlink
- メディア: エレクトロニクス
- この商品を含むブログを見る
ちなみに以下の商品もありますが、今回の目的には必要ない機能(アプリから操作できる)なので値段の安い黒いほうです。アプリから操作できるというよりは黒いほうは日本の正規販売代理店経由のモノではないのではじかれるという感じらしいです(;'∀')
LinkJapan eRemote mini IoTリモコン 家でも外からでもいつでもスマホで自宅の家電を操作【Works with Alexa認定製品】MINI
- 出版社/メーカー: LinkJapan
- メディア: エレクトロニクス
- この商品を含むブログ (2件) を見る
Raspberry Piも家で絶賛稼働中なので外部からリクエストを受け取って赤外線操作できるようにする一連の記事です。
必要なもの
Raspberry Pi
もちろんこれが必要です。種類はどれでも大丈夫ですが安いのはRaspberry Pi Zero系です。ネットで買うよりも日本橋(大阪)や秋葉原で購入するほうが圧倒的に安いです(゜_゜)
Raspberry Pi Zero WH スターターセット (本体・ケース・ヒートシンク・Mini-HDMIケーブル・OTGアダプター)
- 出版社/メーカー: Raspberry Pi
- メディア: エレクトロニクス
- この商品を含むブログを見る
スイッチサイエンスからでもリーズナブルに手に入れることができます(一人1個まで)
Broadlink RM mini3
JFA Broadlinkブラックビーン スマートホームWifi赤外線リモコン [並行輸入品]
- 出版社/メーカー: Broadlink
- メディア: エレクトロニクス
- この商品を含むブログを見る
今回はこれを使用しますが、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