経緯
自宅で4年前に作ったRaspberry Piで動く家電リモコンのアプリが、残念なことにマシン側の故障で逝ってしまった。データは吸い出せたものの、様々な動作基盤を入れていたので復旧が大変面倒だった。
またGPIO制御の精度が低く、リモコン操作できない家電もあった。なのでこの機会にライブラリも見直すことにした。
目標
- どのマシンでも即時起動できるようにリモコンシステムを丸ごとDocker化する。
- Alpineのベースイメージを使ってできる限り軽量化する。
- Pythonライブラリのpigpioを使ってGPIO制御を高精度化する。
- 他システムから制御できるようにWebAPIを設置する。
動作環境
- RaspberryPi
- Docker
- docker-compose
Pigpioとは
マイナーなのか、あまり情報がネットに載ってないGPIO制御ライブラリ。でもどのサイトにも高精度と書かれている。
この開発者が送受信用のソースコードを公開してるので、今回はそれを利用してリモコンを制御する。
Dockerについて
今回はRaspbrry Piで動作させることを前提とするので、超軽量で爆速のAlpineをベースイメージに使用する。
RaspberryPiで動作するものを探したところ、どうやらARM用のベースイメージがある。
GPIOの接続構成
今回は送信用の赤外線LEDを25番ピン、受信用に24番ピンを充てる。
※このピンは後述するソースコード内の「env」ファイルで指定できる。
- 部品は秋月電子で大体手に入る。
部品 | 値段 |
---|---|
赤外線受信モジュール | 150円くらい |
赤外線LED | 100円くらい |
トランジスタ | 40円くらい |
出来上がったもの
ソースコード
全体構成
コンテナ
-
コンソール用httpdコンテナ
管理用のコンソールページを提供し、ユーザーが指定した情報をソケット通信(29920番)でリモコン制御用コンテナへ送る。
WebAPIを設置し、他システムからの連携手段を提供する。
-
リモコン制御用コンテナ
GPIOを制御し、赤外線LEDを発光させる。
httpdコンテナからソケット通信(29920番)で命令を受信し、結果を返す。
実行
-
GitHubからクローンする。
$ git clone https://github.com/souri-t/RemoteControl-RPI.git
-
中に移動して、docker-composeで起動する。
$ cd RemoteControl-RPI $ docker-compose up -d
おわり!
使い方
コンソールページ
-
ブラウザで以下にアクセスする。
http://(マシンのIPアドレス):20080
赤外線送信
赤外線ファイル一つにつき、複数の送信コマンドを含めることができる。
サンプルの1種類の赤外線ファイルには2つの送信コマンドが入っている。
プルダウンメニュー内に表示される赤外線ファイルとコマンドの候補は、GPIO制御用コンテナから受信している。
「execute」を押下すると、指定した赤外線ファイルのコマンドに対応するパルスで赤外線LEDが発光し、実行結果がログに出力される。
赤外線ファイルの作り方
こればかりは未だコンソールページではできません(´Д⊂
-
リモコン制御用コンテナの中に入る。
$ docker-compose exec remote sh
-
以下のコマンドを実行する。直後に待機状態になるため、受信モジュールに向けてリモコンの登録したいボタンを押す。
$ addir (赤外線ファイル名) (送信コマンド名)
例、「tv」というファイルに「power_on」というコマンド名で登録する。
コマンド実行直後から待機中になるため、そこでセンサーに向けて登録したいリモコンのボタンを押下する。
しばらくして"Okey"が表示されると成功。$ addir tv power_on -- リモコンのボタンを押す -- Recording Press key for 'power_on' Okay
Ctrl + P と Ctrl + Qを同時に押下してコンテナを出る。
コンソールページのプルダウンの中に、登録した赤外線ファイルとコマンドが登録されたことを確認する。
他システム連携(WebAPI)
WebAPIで赤外線送信コマンドを実行することもできる。
残念ながらREST APIの形式ではない...
- 「~/api/remotecontrol.php?」の後にパラメータを入力する。
パラメータ | 指定文字列 |
---|---|
filename | 赤外線ファイル名 |
command | 送信コマンド名 |
http://(マシンのIPアドレス):20080/api/remotecontrol.php?filename=(赤外線ファイル名)&command=(赤外線送信コマンド名)
- 例
http://(マシンのIPアドレス):20080/api/remotecontrol.php?filename=samplefile&command=samplecommand1
- 実行後はjson形式で結果が返却される。
種別 | 内容 |
---|---|
commandstatus | 実行結果(success / error) |
filename | 赤外線ファイル名 |
command | 送信コマンド名 |
{
"commandstatus":"success",
"filename":"samplefile",
"sendcommand":"samplecommand1"
}
WebAPIでの連携例
-
Webリモコン
コンソールページだけではリモコンを操作しにくいので、別のWebサーバーでリモコン用のページを作ると扱い易い。この場合は、onClick()時のhttpリクエストに、WebAPIを含んだコンソールページのURLを指定する。
-
Alexa連携
Node-REDの「node-red-contrib-alexa-home-skill」を使うとAlexaと連携できるようになる。そのhttpリクエストの送信先にWebAPIを含んだURLを指定するとAlexaから操作可能になる。
- Alexaスマートホームスキル『Node-RED』を使ってみた https://chasuke.com/alexa_nodered1/
-
Siri連携
早い話、iOSのショートカットアプリにhttpリクエストを実行するユニットがあるので、iOS端末内にボタンを簡単に作ることができる。作ったショートカットは設定次第でSiriでも実行させることができる。
もし外出先からでも操作したい場合はIFTTTのWebhockと連携すると良い。