Mac
bluetooth
GoogleHome

電車が遅れたらGoogleHomeが教えてくれる

会社が電車の遅延情報を教えてくれるアプリをリリースしてるんですが、社内で電車(最寄り路線である京浜東北線)が遅れたら自発的に教えて欲しいという需要があったので簡単にではあるのですが対応してみました。

概要

  • Macで定期的に遅延情報を監視
  • 遅延していたらBluetoothでGoogleHomeに接続
  • SayコマンドでGoogleHomeを喋らせる
  • Bluetoothを切る

正直GoogleHomeである必要も無いんですけどね…。
MacとGoogleHomeが別のネットワークにつながってる関係かつgoogle-home-notifierを使うよりも簡単だったからこれにしてみました。
ただメリットもあってBluetoothに接続した時にGoogleHomeから効果音が流れるので、いきなり喋られるよりは心臓に優しいです。そして意外とGoogleHomeを普段使ってない人からするとまったく別のソリューションであるのが分からないようです(声とか違うんですけどね)。

MacとGoogleHomeをペアリングする

やり方は割愛するとしてMacとGoogleHomeをBluetoothでペアリングしておきます。
これによってMac側のBluetoothがONになると勝手にGoogleHomeにつながります。

Macにm-cliをインストール

m-cliを入れることでコマンドからMacのBluetoothをOn/Off出来るようになります。

構築方法等

bash.sh
# インストール
$ brew install m-cli

# Bluetooth ON
$ m bluetooth enable

# Bluetooth OFF
$ m bluetooth disable

コーディング

Mac上で遅延情報を監視し、変化に応じてsayコマンドでGoogleHomeを喋らせるサンプル。
Pushとか使うべきですねぇ‥。

notify.rb
# sudo ruby notify.rb
require "open3"
require 'net/http'

def bluetooth_on()
  puts "Turn bluetooth on"
  o, e, s = Open3.capture3("m bluetooth enable")
  puts o
  puts e
  puts s
  sleep(15) # つながるまで待つ
end

def bluetooth_off()
  puts "Turn bluetooth off"
  o, e, s = Open3.capture3("m bluetooth disable")
  puts o
  puts e
  puts s
end

# 京浜東北線の遅延情報を返してくれるAPIを叩く。
# すいません、外部には公開してません…。
def keihin_touhoku_info()
  ret = Net::HTTP.get(URI.parse('https://XXXXXX'))
  puts ret
  ret
end

def main_loop()
  puts "Main loop in"
  old_delay_info = keihin_touhoku_info()

  loop do
    sleep(60 * 15)
    # sleep(10)
    new_delay_info = keihin_touhoku_info()
    puts "Check train old_delay_info: " + old_delay_info
    puts "Check train new_delay_info: " + new_delay_info

    if old_delay_info != new_delay_info
      bluetooth_on()
      Open3.capture3("say " + new_delay_info)
      bluetooth_off()
    end
    old_delay_info = new_delay_info
  end
  puts "Main loop out"
end

main_loop()

電車の遅延情報を返却するAPIは外部に公開できなかったので、もし個人で実装する場合には、rti技研様のAPIを使用するのが一番簡単ではないかと思います。
ちなみにサンプルコードで使用しているAPIは正常時には「京浜東北線の運行情報をお知らせします。京浜東北線は現在正常運行に戻りました。」異常時には「京浜東北線の運行情報をお知らせします。京浜東北線は人身事故の影響で上限線ともに運転を見合わせています。」のような文字列を返却してくれるAPIとなっています。

まとめ

いかがでしたでしょうか?AppleとGoogleの夢のコラボ(?)は。
公式に自発的に喋れるような仕組みがあると色々便利だとは思うんですけどね!
それまでの一つの手段として如何でしょう?

参考

https://rcmdnk.com/blog/2016/08/15/computer-mac/