【ラズパイ】電車運行情報の通知をしゃべらせる

GoogleHomeラズパイ

ラズパイとGoogleHomeを連携。電車の運行情報をGoogleHomeで通知します。

出勤時間にバタバタしている会社員
出勤時間にバタバタしている会社員

朝バタバタしているときに、GoogleHomeが電車の運行情報を通知してくれるのは非常に助かります。家を出る前に知っていれば通勤方法を変えることができますからね!

電車で通学する子供を持つ親
電車で通学する子供を持つ親

子供が出発する前に電車が止まっていることが分かれば、車で送ることもできますし、非常に良いです!駅に着いてから運転見合わせを知って、家に帰ってきて車で送るのでは学校に遅刻してしまいますしね!

通勤、通学での電車遅延や運転見合わせって。。。

電車

事前に知っていればなぁ。。。と思うことが多々あります。スマホのアプリを入れておけば、スマホを持っている時だったら、その通知で気づいて経路を変えたりすると思います。

ただし、朝、家にいるときはスマホはバイブにしていて、しかも、手元には置いていない、という人も多いと思います。

朝の自宅ではスマホの通知には気づかないことが多い

実際、私もスマホは常にバイブですし、家にいるときはPC机の上に置きっぱなしなので、通知に気づかないことも多々あります。

ですので、朝、電車が遅れている通知が来ても、その時には気づかずに、後で気づく、ということがあります。

電車の運行情報をGoogleHomeが喋る

そんな人(自分)のために、決まった時間に電車の運行情報を調べて、

通知すべきこと(遅延、運転見合わせ)があれば、GoogleHomeが”電車の運行情報が出ています。確認してください!”と喋ってくれるプログラム

を紹介します。

ラズパイを使った初心者向け

本当は、具体的な遅延状況や運転見合わせの時間なども通知出来たら良いのですが、私は初心者なので、そこまではできません。。。。

何かありましたよー。というのを教えてくれるだけで、あとは自分でスマホで調べています。

ただし、実際これぐらいで十分です。なぜなら、

やっぱりスマホで調べた方がリアルタイムで調べられるし、正確なんです。。。

スマホ

ラズパイとGoogleHomeの連携で準備するもの

  • ラズパイ
  • GoogleHome

だけです、シンプルな構成で簡単に実現できます。ラズパイはぜひスターターキットを買ってください。特におすすめなのはこちらで紹介しているものです。オールインワンなので、これを買えば他には不要です。別々で買うよりも簡単ですし、安いし、格好よくできます。

つぎは、

運行情報のwebページから必要な情報を抽出する、Webスクレイピング

webページ

非常に簡単で、スクレイピングという手法を使います。スクレイピングとはwebに掲載されている情報から、欲しい情報だけを抽出する手法です。

たとえば、電車の運行情報であれば、Yahooの運行情報のページから、自分が知りたい鉄道の現在の情報だけを抽出します。本当はある程度、そのページの構造を理解していた方が良いとは思いますが、
深く理解していなくても、トライ&エラーを繰り返すことでいつかうまくいきます。

スマートなやり方としては、十分にwebページの構造を理解して、抽出する、というやり方だとは思いますが、初心者にはそれは難しいので、時間を掛けて答えを発見します。スクレイピングは簡単な手法なので、そういうやり方でもできちゃいます。

注意)スクレイピングは、あまり高頻度に情報を読みに行くとロボットだと思われたり、相手のサーバーに負荷を掛けることになるので、高頻度に読みに行くような使い方は避けましょう。次に、

抽出した情報があらかじめ設定したキーワード(=normal)と同じかどうか比較

スクレイピングで抽出した情報(=それは電車の運行状況)が、”平常運転”
なのか、を確認します。

”平常運転”であれば、何もしません。”知らせがないことが良い知らせ”理論です。

一方、”平常運転”ではなかった場合、それは”運転見合わせ”か”遅延”を意味しますが、その時には、GoogleHomeを喋らせるコマンドを実行します。その結果、”電車の運行情報が出ています。確認してください!”と喋ります。

考え方は非常にシンプルです。初心者の私でも簡単にできました。

ラズパイを使った具体的な方法

①ライブラリインポート

ライブラリ

まずは、必要なライブラリをインポートします。

from bs4 import BeautifulSoup as bs
import urllib.request as ur 
import re
import subprocess

②Yahooの運行情報HPを開く

運行情報のHPを開きます。今回はYahooの運行情報HPを使用し、京浜東北線の情報を抽出します。そのために、まずはYahooの京浜東北線の運行情報HPを開きます。

Yahooの運行情報HP

つぎに、右クリックして、”ページのソースを表示”をクリックして、ソースを表示します。そこで、運行情報を示しているところを探します。

<div id="mdServiceStatus">
<dl>
<dt><span class="icnNormalLarge">[○]</span>平常運転</dt>
<dd class="normal">
<p>現在、事故・遅延に関する情報はありません。</p>
Yahooの運行情報

id=”mdServiceStatus”が運行情報を表すところになります。平常運転と書いてあり、さらにその次の行に、

class=”normal”

とあります。すなわち、”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 -eとターミナルで打つと、編集画面になるので、実行させたい時刻、日付とファイルのパスを入力してください。あとは、その時刻を待つだけです。

Python

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)

コメント