LoginSignup
6
12

More than 3 years have passed since last update.

Raspberry Piで家電をコントロールするリモコンアプリをコンテナ化して運用した話

Last updated at Posted at 2019-06-10

経緯

自宅で4年前に作ったRaspberry Piで動く家電リモコンのアプリが、残念なことにマシン側の故障で逝ってしまった。データは吸い出せたものの、様々な動作基盤を入れていたので復旧が大変面倒だった。
またGPIO制御の精度が低く、リモコン操作できない家電もあった。なのでこの機会にライブラリも見直すことにした。

  • 問題のリモコンアプリ。LAMP環境やPython環境などをOSの上に直接インストールして動いていた頃。 oldremocon.JPG

目標

  • どのマシンでも即時起動できるようにリモコンシステムを丸ごとDocker化する。
  • Alpineのベースイメージを使ってできる限り軽量化する。
  • Pythonライブラリのpigpioを使ってGPIO制御を高精度化する。
  • 他システムから制御できるようにWebAPIを設置する。

動作環境

  • RaspberryPi
    • Docker
    • docker-compose

Pigpioとは

マイナーなのか、あまり情報がネットに載ってないGPIO制御ライブラリ。でもどのサイトにも高精度と書かれている。
この開発者が送受信用のソースコードを公開してるので、今回はそれを利用してリモコンを制御する。

pigpio

Dockerについて

今回はRaspbrry Piで動作させることを前提とするので、超軽量で爆速のAlpineをベースイメージに使用する。

RaspberryPiで動作するものを探したところ、どうやらARM用のベースイメージがある。

armhf/alpine

GPIOの接続構成

今回は送信用の赤外線LEDを25番ピン、受信用に24番ピンを充てる。

※このピンは後述するソースコード内の「env」ファイルで指定できる。
kairo.png

  • 部品は秋月電子で大体手に入る。
部品 値段
赤外線受信モジュール 150円くらい
赤外線LED 100円くらい
トランジスタ 40円くらい

出来上がったもの

remocon_preview.JPG

ソースコード

RemoteControl-RPI

全体構成

container.jpeg

コンテナ

  • コンソール用httpdコンテナ

    管理用のコンソールページを提供し、ユーザーが指定した情報をソケット通信(29920番)でリモコン制御用コンテナへ送る。

WebAPIを設置し、他システムからの連携手段を提供する。

  • リモコン制御用コンテナ

    GPIOを制御し、赤外線LEDを発光させる。

    httpdコンテナからソケット通信(29920番)で命令を受信し、結果を返す。

実行

  1. GitHubからクローンする。

    $ git clone https://github.com/souri-t/RemoteControl-RPI.git
    
  2. 中に移動して、docker-composeで起動する。

    $ cd RemoteControl-RPI
    $ docker-compose up -d
    

    おわり!

使い方

コンソールページ

  • ブラウザで以下にアクセスする。

    http://(マシンのIPアドレス):20080
    

console_top.png

赤外線送信

赤外線ファイル一つにつき、複数の送信コマンドを含めることができる。
サンプルの1種類の赤外線ファイルには2つの送信コマンドが入っている。

プルダウンメニュー内に表示される赤外線ファイルとコマンドの候補は、GPIO制御用コンテナから受信している。

console_select.png

「execute」を押下すると、指定した赤外線ファイルのコマンドに対応するパルスで赤外線LEDが発光し、実行結果がログに出力される。

console_executed.png

赤外線ファイルの作り方

こればかりは未だコンソールページではできません(´Д⊂

  1. リモコン制御用コンテナの中に入る。

    $ docker-compose exec remote sh
    
  2. 以下のコマンドを実行する。直後に待機状態になるため、受信モジュールに向けてリモコンの登録したいボタンを押す。

    $ addir (赤外線ファイル名) (送信コマンド名)
    

    例、「tv」というファイルに「power_on」というコマンド名で登録する。
    コマンド実行直後から待機中になるため、そこでセンサーに向けて登録したいリモコンのボタンを押下する。
    しばらくして"Okey"が表示されると成功。

    $ addir tv power_on
    -- リモコンのボタンを押す --
    Recording Press key for 'power_on' Okay
    
  3. Ctrl + P と Ctrl + Qを同時に押下してコンテナを出る。

  4. コンソールページのプルダウンの中に、登録した赤外線ファイルとコマンドが登録されたことを確認する。

他システム連携(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を指定する。

remocon.JPG

  • Alexa連携
    Node-REDの「node-red-contrib-alexa-home-skill」を使うとAlexaと連携できるようになる。

    そのhttpリクエストの送信先にWebAPIを含んだURLを指定するとAlexaから操作可能になる。

    nodered.png

  • Siri連携
    早い話、iOSのショートカットアプリにhttpリクエストを実行するユニットがあるので、iOS端末内にボタンを簡単に作ることができる。作ったショートカットは設定次第でSiriでも実行させることができる。
    もし外出先からでも操作したい場合はIFTTTのWebhockと連携すると良い。

    siri.png

参考

Raspberry PiのGPIO制御の決定版 pigpio を試す

6
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
12