ぶるーすくりーん

ぽんこつプログラマ日記

Google Home から音声でエアコンを制御する(Raspberry pi 3 と LIRC)

Google Home で家電のリモコン制御に挑戦してみた記録です。
また、ほぼ同じ構成・設定で、IFTTT のトリガーを追加するだけで、家の外から家電を操作することが可能になる、こちらの記事も合わせてどうぞ。

mid0111.hatenablog.com

できるようになること

Google Home に「OK グーグル!暖房をつけて!」と話しかけると、エアコンを暖房モードでつけてくれます。

できあがり

f:id:tajima0111185:20180129110245p:plain

エアコン以外にも、同じ方法でオーディオ、電気も制御しています。
ちなみに、うちの TV は SONYAndroid TV で、ネットワークからのコマンド送信で制御可能なので、こちらの電源は alanreid/bravia を利用して制御しています。

配線むき出しだと、見た目もあれだし、ホコリ被って火事とかになってもやなので、 ユニバーサル回路ケース(High, Clear) ブレッドボード付-3ple Decker に入れてみました。

プラスチックを赤外線が透過するかが心配だったのですが、少なくとも透明であれば大丈夫でした。
赤外線 LED を2つ搭載していることもあり、感度はなかなかよろしいです。
この配置で右下のオーディオまで赤外線届くとは思っていませんでした。

構成

f:id:tajima0111185:20180129095958p:plain

Firebase は無料プランを利用します。
Firebase は、保存可能なデータ量やダウンロード量などに制限がありますが、個人で Google Home と連携するという目的で使うのみであれば、無料枠で十分です。
詳しくは、Firebase 料金 を参照してください。

やることの流れ

  • 電子回路作成
  • 赤外線信号の保存
  • アプリから呼び出し
    • Firebase の設定 (*1)
    • IFTTT の設定
    • expresss アプリ作成
      • Firebase のデータ読み込み (*2)
      • 赤外線送信

*1 の部分は Google Home から音声で Google Fit にアクティビティを追加する1(Firebase・IFTTT 編) とやること同じなので、そちらの記事を参照してください。
*2 の部分は Google Home から音声で Google Fit にアクティビティを追加する2(nodejs・Google Fit 編) とやること同じなので、そちらの記事を参照してください。

電子回路作成

電子回路の設計、作成はすべて以下の記事を参考にさせてもらいました。

qiita.com

他にもいろいろと Raspberry pi で赤外線リモコン!みたいな記事はありましたが、赤外線送信時に流れる電流が小さい(リモコン強度が弱くなる)、トランジスタとかコンデンサかませってモジュールの仕様書にあるのにかましてない・・・などなどの理由でやめました。

ただ、記事で紹介されている部品がなかったりで、一部以下に変更しています。
トランジスタが同じ規格のものが無くて、紹介記事よりも大きめの電流が流れるのが少し心配ですが、一応 LED の許容範囲内のはず。

赤外線信号の保存

こちらも、基本は上記記事の lirc のインストールと lirc-rpi 有効化 以降をやっていきますが、バージョン違い(?)などにより、そのままでは動かなかったので、以下を変更しています。

lirc のインストールと lirc-rpi 有効化

/boot/config.txt の編集時に gpio_in_pull=up を追加

dtoverlay=lirc-rpi,gpio_in_pin=24,gpio_out_pin=25,gpio_in_pull=up

リモコンの信号を記録する

irrecord というコマンドを使用すると、いい感じにリモコン信号を記憶してファイル作成まで自動的にやってくれるので、irrecord コマンドを使用します。
irrecord 関連の操作は以下を参考にしました。
/boot/config.txt などの設定は、 Qiita の方の記事のままです。

Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法 (Raspberry Pi Raspbian Stretchで赤外線リモコンの制御アプリ LIRC 0.9.4cの設定方法)

ただ、この irrecord というコマンド、エアコンなどの複雑な信号だと長過ぎてうまく記憶できないという問題がありました。
なので、うまく動かない場合は Qiita の方の記事のやり方で手動で作成していきます。
逆に、オーディオなどは irrecord ではうまくいきましたが、下記の手順では "transmission failed Error running command: Input/output error" となり、うまくいきませんでした。

以下、Qiita 版の手動での作成 での変更点です。

mode2 コマンド実行時に sed -ue '1d' で先頭1行目を削除しているが、不要な行が2行あるようです。

mode2 -d /dev/lirc0 | tee heat
Using driver default on device /dev/lirc0
space 2073884  
pulse 3531
space 1711
pulse 468
space 422
pulse 451
space 1309
pulse 455
space 423
:

1行目のコメントっぽいのは不要です。
また、2行目の space はリモコン押すまでのゴミらしいので、不要です。
なので、いったん生データを書き出して、その後エディタなどで確認してデータに合わせて不要な行を削ったほうが良さそうです。

整形して lircd.conf を作成する

ここも、記事の方では直接 lircd.conf を修正していますが、いまどきは /etc/lirc/lircd.conf.d 配下に機能毎に設定ファイルをつくるのがオススメのようだったので、そのようにしました。

/etc/lirc/lircd.conf.d/aircon.lircd.conf を作成し、以下のように編集します。

begin remote

  name  aircon
  flags RAW_CODES
  eps            30
  aeps          100

  gap          200000
  toggle_bit_mask 0x0

      begin raw_codes

          name heat
3531    1711    468    422    451    1309
455    423    451    422    451    425
451    424    452    423    450    423
〜省略〜
369    511    365    1350    420    1347
422

          name cold
〜省略〜

          name stop
〜省略〜

      end raw_codes

end remote

あとは、記事に従って、irsend でエアコンが動作すれば OK です。

作成した設定ファイルは GitHub を参照してください。 audio.lircd.conf が irrecord で生成したもの、aircon.lircd.conf と light.lircd.conf が手動で作成したものです。

アプリから呼び出し

赤外線送信

nodejs から child_process.exec を用いて irsend コマンドを実行します。

ソースの全体の流れは こちら を参照してください。

exec(`irsend SEND_ONCE aircon heat`, (error) => {
  if (error) {
    console.error('Failed to turn on aircon (heat).', error);
  }
});

補足:バージョン情報

$ dpkg -l | grep lirc
ii  liblirc-client0:armhf                 0.9.4c-9                             armhf        infra-red remote control support - client library
ii  liblirc0:armhf                        0.9.4c-9                             armhf        Infra-red remote control support - Run-time libraries
ii  lirc                                  0.9.4c-9                             armhf        Infra-red remote control support - daemons and utils
$ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

感想とか

Web を検索すると lirc は無理みたいな記事が、結構上位に出てきてしまいますが、Raspberry pi 3(Stretch) と lirc 0.9.4 では問題なく動きました。

ただ、私のように電子回路初心者だと、電子回路が間違っているのか、lirc の設定が間違っているのか、赤外線の向きなどの問題で届いてないのか、などの切り分けが難しかったです。
実際、動かないなーって首捻ってたら電子回路2箇所くらい間違えてました。
きっと、テスターとか持ってて使える人だと少なくとも電子回路の間違いはすぐに気づくのでしょうね。

基本的に lirc の設定の問題だと何かしらエラーメッセージが出たように思います。

irMagician とか学習用のリモコンキッド買おうか迷ったのですが、せっかく Raspberry pi 持ってるんだから1度くらい電子工作に挑戦してみたいなと思い、自作してみました。
電子回路の設計とか他の人の記事が無いと絶対わかんなかったけど、なんとかできて満足です。

次は、「おやすみ」とか「いってきます」って言ったらまとめて以下のような操作してくれるようにしたいと目論んでいます。

  • 電気消す
  • エアコン消す
  • TV 消す
  • オーディオ消す

消すのはいいんだけど、逆をしようとすると

  • 電気つけるべき?自然光で十分?
  • 暖房?エアコン?

みたいの判断しないといけなくって、となると照度センサーとか温度センサーとかに挑戦かな?