会社が電車の遅延情報を教えてくれるアプリをリリースしてるんですが、社内で電車(最寄り路線である京浜東北線)が遅れたら自発的に教えて欲しいという需要があったので簡単にではあるのですが対応してみました。
#概要
- 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出来るようになります。
##構築方法等
# インストール
$ brew install m-cli
# Bluetooth ON
$ m bluetooth enable
# Bluetooth OFF
$ m bluetooth disable
#コーディング
Mac上で遅延情報を監視し、変化に応じてsayコマンドでGoogleHomeを喋らせるサンプル。
Pushとか使うべきですねぇ‥。
# 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の夢のコラボ(?)は。
公式に自発的に喋れるような仕組みがあると色々便利だとは思うんですけどね!
それまでの一つの手段として如何でしょう?