ラズパイ専用 学習リモコン基板を買ったので、GoogleHome経由で家電を操作してみた

GoogleHomeが安くなってたので勢いで購入

まずやりたくなるのは家電の操作

「OK Google テレビをつけて!」「エアコンを消して!」とかやりたい

調べてみると、ラズパイとリモコンの赤外線を学習して送信できるデバイスが必要とのこと

さっそく必要なものを購入してみた

Raspberry Pi 3

ラズパイ専用 学習リモコン基板(ビット・トレード・ワン)

最近 (2017/12/15) 発売したばかり。赤外線を学習してくれる

pc.watch.impress.co.jp

学習リモコンの基本操作

学習リモコンはラズパイ専用だけあって、ハンダ付けなしで差込口に装着するだけ

既存ケースと合わせるとこんな感じになった

1. 赤外線を登録する

  1. 真ん中辺りのスライドスイッチを『LEARNモード』にする
  2. 登録したいボタンを押す
  3. リモコンの登録したいボタンを押す
  4. スイッチを戻す

公式ページに動画で手順が乗ってるのでこっち見たほうが早い

登録したボタンを押すとリモコンと同じ操作が出来るようになってる

2. コマンドラインから操作する

物理ボタンを押して送信されたら、まぁそうなるわなって感じで

ラズパイにsshで入って、そこから操作する方法が分からなかったので調べた

学習リモコンの説明書に GPIO というワードが書いてあった

これまで知らなかったが、この規格を通してハードである学習リモコンを操作出来る

GPIOの操作はこの記事が分かりやすかった

ツール・ラボ » 第24回 Raspberry PiのGPIOを制御する(コマンド編)

学習リモコンには10個のボタンがあり、それぞれに番号が振られていてGPIO番号と紐付いてる

f:id:rskull:20171224005529j:plain

ボタンの1番目(SW番号1)に登録したとして、操作したい場合はGPIO番号が4になる

$ cd /sys/class/gpio/
$ ls
export  gpiochip0  gpiochip100  gpiochip128  unexport

GPIO4が欲しいのでexportする

$ echo 4 > export
$ ls
export  gpio4  gpiochip0  gpiochip100  gpiochip128  unexport

gpio4 ができた

ここからの挙動がいまいち分かって無いが、こんな感じで操作?できた

$ echo out > gpio4/direction // 送信される
$ echo 1 > gpio4/value
$ echo 0 > gpio4/value  // 送信される
$ echo 1 > gpio4/value
$ echo 0 > gpio4/value  // 送信される

多分何か間違ってるけど、送信することは出来た

不要になったらunexportする

$ echo 4 > gpio4/unexport

3. nodejsで操作する

今のようなコマンド操作をラップしたライブラリが各言語何種類か出ている

今回はnodejsで操作したかったのでrpi-gpioを使ってみた

GitHub - JamesBarwell/rpi-gpio.js: Control Raspberry Pi GPIO pins with node.js

さっそくボタン1に登録した赤外線を送信するコードを書いた

demo.js

const gpio = require('rpi-gpio')
const number = 7

gpio.setup(number, gpio.DIR_OUT, () => {
  gpio.write(number, 1, () => {
    gpio.destroy() // これを書かないとシェルが戻ってこなかった
  })
})

const number = 7 の部分、4ではなくなぜ7なの?とハマったところ

BCM 4 at Raspberry Pi GPIO Pinout

このサイトでBCM 4の項目を見ると7と対応してるから7‥.と言うことっぽい

f:id:rskull:20171225234544p:plain

$ node demo.js

これで実行してみると1回だけ赤外線が送信される

GoogleHomeから操作出来るようにする

話しかけた言葉に対して何かをするのに、IFTTTを使うのが一番簡単

大体こんな流れ

GoogleHome -> IFTTT (Google Assistant) -> (Webhook) -> Firebase -> RasPi -> 学習リモコンから信号を送信 -> 家電が起動!

GoogleHomeに特定のフレーズで喋った言葉をIFTTTが拾ってWebhookでFirebaseにフレーズを送信

ラズパイ上で動かしてるnodejsでFirebaseのリアルタイムDBを監視して

変更があればそのワードを正規表現でマッチさせ、あとは任意のコードを実行させる。という手順

1. Firebaseを準備

https://firebase.google.com

趣旨じゃないので登録手順は省く

プロジェクトに入ってデータベースを以下のような構成にする

f:id:rskull:20171226000941p:plain

自分の場合は操作したい家電名の下にコマンドを置く階層構造にした

2. IFTTTでレシピを設定

まずはGoogleHomeに話しかけた言葉を認識してもらうために

GoogleHomeと同じアカウントでIFTTTに登録する

New Appletで新しいレシピを作成

最初のifで Google Assistant -> Say a phrase with a text ingredient を選択

f:id:rskull:20171226003710p:plain

「電気...」に続く言葉をすべて取る

thenで Webhook を選択

f:id:rskull:20171226003732p:plain

URLはhttps://xxxxx-firebaseio.com/light/command.js という感じになる

lightの部分は自分が設定したキーに合わせて変える

この内容でレシピを作成して有効にする

3. ラズパイ上で変更を監視する

GoogleHomeに『テレビつけて』などと話しかけると

IFTTTからFirebaseに喋ったフレーズを投げてくるようになった

その変更をラズパイ上でnodeを動かして監視する

ついでにさっきの学習リモコンの操作も合わせて使ってみる

わかりやすく愚直にコードを書いた

light.js

/**
 * 電気の操作
 */
const firebase = require('firebase')
const gpio = require('rpi-gpio')

// 自分の環境
const config = {
  apiKey: 'xxxxxxxxxxxxx'
  authDomain: 'xxxxx.firebaseapp.com',
  databaseURL: 'https://xxxxxx.firebaseio.com',
  projectId: 'xxxxx'
  storageBucket: 'xxxxx.appspot.com',
  messagingSenderId: '123456789'
}

// ボタン1
const number = 7

firebase.initializeApp(config)

const db = firebase.database()
const ref = db.ref('/light') // DBで最初の階層に設定したキー

ref.on('value', function(changedSnapshot) {
  const key = changedSnapshot.key
  const command = changedSnapshot.child('command').val()

  if (command !== '') {
    switch (true) {
      case /起動|つけ.*て/.test(command):
        // 学習リモコンから赤外線を送信
        gpio.setup(number, gpio.DIR_OUT, () => {
          gpio.write(number, 1, () => {
            gpio.destroy()
          })
        })
        break
      case /消して|止めて/.test(command):
        gpio.setup(number, gpio.DIR_OUT, () => {
          gpio.write(number, 1, () => {
            gpio.destroy()
          })
        })
        break
    }

    // リセット
    ref.set({ command: '' })
  }
})

$ node light.js

これで家電が操作出来るようになった!

赤外線とは別だけどテレビも出来きた

GoogleHomeが1回で認識してくれなくて、何回も声を出すと徒労感しかないけど

なぜこんな事するのかって言われると、それはロマンですね

こんな感じでスマート?ホーム化がはじまったのです

なお一ヶ月前

おわり

参考リンク