遅ればせながらGoogle Home Miniを買ったので,遊んでいます.
会社でも調査用途で1台買ってあり,周りの人に遊んでもらえるように置いているのですが「盗難対策どうしよう・・・」と悩んでいました.そこで,ちょうど↓の記事でGoogle Homeにしゃべってもらうというのがあったので,そちらを参考に,盗まれそうになったらGoogle Home自身に悲鳴を上げてもらうようにしてみました!
帰宅したらGoogleHomeから好きな音声で「おかえり」って言ってもらいます
環境
- macOS 10.12
- Node.js 6.11
結果
このような感じになりました.
- 長めに叫ばせようと思って
"助けてーー!!盗まれるーーーーーーー!!"
というテキストを読み上げさせたら,語尾が情けない感じに😒
構成
ラズパイはまだ使ったことがなかったので,以下のような構成にしました.
- Google Home Miniがそこにあることを圧力センサで検知してTWELITE(ZigBee)で飛ばしてmac上のNode.jsプロセスで処理し,google-home-notifierでしゃべらせています.
-
Google Home Miniの重さだけでは圧力センサが十分反応しなかったので,MacBookのACアダプタ(と500円玉)を間にかませています.何か別のセンサにすればよかったかも・・・
-
親機(mac)側はこのような感じでUSBシリアル変換アダプタ(AE-UM232R)を経由しています
コード
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で作成した回路図も含め,以下にコード等を置いています.
やってみて
盗難されるときは電源抜かれるんだから意味ないよね・・・😝