ラズパイとGoogleHomeを連携。電車の運行情報をGoogleHomeで通知します。
朝バタバタしているときに、GoogleHomeが電車の運行情報を通知してくれるのは非常に助かります。家を出る前に知っていれば通勤方法を変えることができますからね!
子供が出発する前に電車が止まっていることが分かれば、車で送ることもできますし、非常に良いです!駅に着いてから運転見合わせを知って、家に帰ってきて車で送るのでは学校に遅刻してしまいますしね!
通勤、通学での電車遅延や運転見合わせって。。。
事前に知っていればなぁ。。。と思うことが多々あります。スマホのアプリを入れておけば、スマホを持っている時だったら、その通知で気づいて経路を変えたりすると思います。
ただし、朝、家にいるときはスマホはバイブにしていて、しかも、手元には置いていない、という人も多いと思います。
朝の自宅ではスマホの通知には気づかないことが多い
実際、私もスマホは常にバイブですし、家にいるときはPC机の上に置きっぱなしなので、通知に気づかないことも多々あります。
ですので、朝、電車が遅れている通知が来ても、その時には気づかずに、後で気づく、ということがあります。
電車の運行情報をGoogleHomeが喋る
そんな人(自分)のために、決まった時間に電車の運行情報を調べて、
を紹介します。
ラズパイを使った初心者向け
本当は、具体的な遅延状況や運転見合わせの時間なども通知出来たら良いのですが、私は初心者なので、そこまではできません。。。。
ただし、実際これぐらいで十分です。なぜなら、
やっぱりスマホで調べた方がリアルタイムで調べられるし、正確なんです。。。
cript type="text/javascript" src="https://xml.affiliate.rakuten.co.jp/widget/js/rakuten_widget.js">
ラズパイとGoogleHomeの連携で準備するもの
- ラズパイ
- GoogleHome
だけです、シンプルな構成で簡単に実現できます。ラズパイはぜひスターターキットを買ってください。特におすすめなのはこちらで紹介しているものです。
運行情報のwebページから必要な情報を抽出する、Webスクレイピング
非常に簡単で、スクレイピングという手法を使います。
たとえば、電車の運行情報であれば、Yahooの運行情報のページから、自分が知りたい鉄道の現在の情報だけを抽出します。本当はある程度、そのページの構造を理解していた方が良いとは思いますが、
スマートなやり方としては、十分にwebページの構造を理解して、抽出する、というやり方だとは思いますが、初心者にはそれは難しいので、時間を掛けて答えを発見します。スクレイピングは簡単な手法なので、そういうやり方でもできちゃいます。
次に、
抽出した情報があらかじめ設定したキーワード(=normal)と同じかどうか比較
スクレイピングで抽出した情報(=それは電車の運行状況)が、”平常運転”
なのか、を確認します。
一方、”平常運転”ではなかった場合、それは”運転見合わせ”か”遅延”を意味しますが、その時には、
その結果、”電車の運行情報が出ています。確認してください!”と喋ります。
考え方は非常にシンプルです。初心者の私でも簡単にできました。
ラズパイを使った具体的な方法
①ライブラリインポート
まずは、必要なライブラリをインポートします。
from bs4 import BeautifulSoup as bs
import urllib.request as ur
import re
import subprocess
②Yahooの運行情報HPを開く
運行情報のHPを開きます。今回はYahooの運行情報HPを使用し、京浜東北線の情報を抽出します。そのために、まずはYahooの京浜東北線の運行情報HPを開きます。
つぎに、右クリックして、”ページのソースを表示”をクリックして、ソースを表示します。そこで、運行情報を示しているところを探します。
<div id="mdServiceStatus">
<dl>
<dt><span class="icnNormalLarge">[○]</span>平常運転</dt>
<dd class="normal">
<p>現在、事故・遅延に関する情報はありません。</p>
id=”mdServiceStatus”が運行情報を表すところになります。平常運転と書いてあり、さらにその次の行に、
class=”normal”
とあります。すなわち、”normal”とあれば、それは”平常運転”であり、それ以外の文字であれば、”平常運転ではない”ということになります。
ここが肝です。
①”https://transit.yahoo.co.jp/traininfo/detail/27/0/”の”mdServiceStatus”に書いてあることを抽出しなさい
def Soup():
url = 'https://transit.yahoo.co.jp/traininfo/detail/27/0/'
req = ur.urlopen(url)
html = bs(req,"html.parser")
return html
match_JR = Soup().find('div', {'id': 'mdServiceStatus'})
str_match_JR = str(match_JR)
②normalが書いてあったら、”順調”と表示しなさい
if "normal" in str_match_JR:
print("京浜東北線は順調")
③normalが書いてなかったら、GoogleHomeを喋らせるコマンドを実行しなさい
else:
print("京浜東北線に運行情報あり")
Train_say = 'sh /home/pi/Documents/Train.sh'
subprocess.call(Train_say, shell=True)
とします。そして、あとは、Train.shというGoogleHomeを喋らせるファイルを実行するだけです。Train.shの中身は下のようなシンプルなものでOKです。ラズパイからGoogleHomeを喋らせる方法は、以前に紹介した
こちらです。
curl -X POST -d "text=電車の運行情報が出ています。確認してください。" http://192.168.0.9:8091/google-home-notif
③crontabで定期的に実行させる
最後に作ったファイルを決まった時刻に実行させればそれでOKです。そのためにはcrontabというコマンドを使います。
あとは、その時刻を待つだけです。
crontabの書き方は、
分 時 日 月 曜日(1が月曜日、7が日曜日) プログラムのパス
という順番で入力します。上の例は、平日の6時15分に実行しなさい、というcrontabになります。これで完成です。ぜひ試してみてください。最後にプログラムのソースです。
from bs4 import BeautifulSoup as bs
import urllib.request as ur
import re
import subprocess
#京浜東北線の運行状況
def Soup():
url = 'https://transit.yahoo.co.jp/traininfo/detail/27/0/'
req = ur.urlopen(url)
html = bs(req,"html.parser")
return html
match_JR = Soup().find('div', {'id': 'mdServiceStatus'})
str_match_JR = str(match_JR)
if "normal" in str_match_JR:
print("京浜東北線は順調")
else:
print("京浜東北線に運行情報あり")
Train_say = 'sh /home/pi/Documents/Train.sh'
subprocess.call(Train_say, shell=True)
コメント