3
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-16

遅ればせながら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

やってみて

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

3
4
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
3
4