IoT
TWELite
GoogleHome

Google Homeが盗まれたら自分で悲鳴を上げてもらいます

More than 1 year has passed since last update.

遅ればせながらGoogle Home Miniを買ったので,遊んでいます.

会社でも調査用途で1台買ってあり,周りの人に遊んでもらえるように置いているのですが「盗難対策どうしよう・・・」と悩んでいました.そこで,ちょうど↓の記事でGoogle Homeにしゃべってもらうというのがあったので,そちらを参考に,盗まれそうになったらGoogle Home自身に悲鳴を上げてもらうようにしてみました!

帰宅したらGoogleHomeから好きな音声で「おかえり」って言ってもらいます

環境

  • macOS 10.12
  • Node.js 6.11

結果

このような感じになりました.

2.jpg YouTube

  • 長めに叫ばせようと思って"助けてーー!!盗まれるーーーーーーー!!"というテキストを読み上げさせたら,語尾が情けない感じに😒

構成

ラズパイはまだ使ったことがなかったので,以下のような構成にしました.

google-home-shout.png

  • Google Home Miniがそこにあることを圧力センサで検知してTWELITE(ZigBee)で飛ばしてmac上のNode.jsプロセスで処理し,google-home-notifierでしゃべらせています.
  • Google Home Miniの重さだけでは圧力センサが十分反応しなかったので,MacBookのACアダプタ(と500円玉)を間にかませています.何か別のセンサにすればよかったかも・・・

    google-home-shout-device.jpg

  • 親機(mac)側はこのような感じでUSBシリアル変換アダプタ(AE-UM232R)を経由しています

    google-home-shout-gateway.jpg

コード

index.js
const googlehome = require('google-home-notifier');
const SerialPort = require('serialport');

// setup seiarl port
const port = new SerialPort(process.env.TWELITE_PORT, {
  baudRate: 115200,
})

// setup google home
googlehome.device(process.env.GOOGLE_HOME_NAME, 'ja')
googlehome.ip(process.env.GOOGLE_HOME_IP)


port.on('open', () => {
  console.log('port opened')
})

port.on('error', err => {
  console.log('Error: ', err.message);
})

let buffer = ""
port.on('data', data => {
  for (const k of data.keys()) {
    const s = data.toString('utf8', k, k + 1)
    if (s == '\r' || s == '\n') {
      if (buffer !== "") {
        handleTweliteLine(buffer)
        buffer = ""
      }
    } else {
      buffer = buffer + s
    }
  }
})

let lastState // 0: Google Home is on the sensor, 1: not
function handleTweliteLine(line) {
  if (line.length != 49 || line.indexOf(':') != 0) {
    console.error(`invalid line: ${line}`)
    return
  }
  const state = line.charAt(34) == '1' ? 1 : 0
  if (lastState != state) {
    console.log('state changed', state)
  }
  if (lastState == 0 && state == 1) {
    console.log('盗まれた!')
    googlehome.notify('助けてーー!!盗まれるーーーーーーー!!', (res) => {
      console.log(res)
    })
  }
  lastState = state
}
  • port.on('data', data => {}) でTWELITEからのシリアルデータを処理しています
    • 圧力センサはTWELITEのDI1に入力しているので,こちらを参考に35バイト目が0か1かで圧力センサの状態を判断しています
  • 改行コードを検知したら,TWELITEの電文としてhandleTweliteLine()で状態の確認とGoogle Homeへの読み上げ要求を出しています

実行して(YouTubeの動画のように)Google Homeを圧力センサに載せる・除けるをすると,次のような出力になります.

$ export GOOGLE_HOME_NAME="<Google Homeの名前>"
$ export GOOGLE_HOME_IP="<Google HomeのIP>"
$ export TWELITE_PORT="/dev/<TWELITEのTTYデバイス名>"
$ node index.js
port opened
state changed 1
state changed 0
state changed 1
盗まれた!
Device notified

Fritzingで作成した回路図も含め,以下にコード等を置いています.

ottijp/google-home-shout

やってみて

盗難されるときは電源抜かれるんだから意味ないよね・・・😝