にゃみかんてっくろぐ

猫か百合を見守る壁になりたい

Raspberry Piでダッシュボードを作る(7) -時刻表-

f:id:no_clock:20171016214958j:plain

Raspberry Piとミニディスプレイ,各種センサを使ってダッシュボードを作ります.


今回のゴール

  • 通勤に使っている最寄り駅の時刻表を表示させる.

いちいち最寄り駅の時刻表を調べるのは面倒です.ダッシュボードに常に表示させておきましょう.

時刻表の抽出

今回は Yahoo!路線情報 を利用します(※個人利用に留めましょう).例として 日比谷駅(東京メトロ日比谷線)の時刻表 を使ってみます.

情報の抽出には, Nokogiri ライブラリを用います(スクレイピングとも言います).使い方は他所に譲るとして,下記スクリプトparse.rb といった名前で用意します.

#!/usr/bin/env ruby
require 'net/http'
require 'nokogiri'

data = Nokogiri::HTML.parse(Net::HTTP.get(URI.parse(ARGV[0])))

data.css('table.tblDiaDetail > tr').each do |node|
  hour = node.css('td:first-child').text.rjust(2,"0")
  node.css('td:last-child > ul > li').each do |train|
    next if train.text !~ /(\d+)/
    minute = $1.rjust(2,"0")
    puts "#{hour}:#{minute}"
  end
end

実行してみましょう.

$ gem install nokogiri # Nokogiriライブラリをインストール
$ chmod +x ./parse.rb # 実行権限を付与
$ ./parse.rb "https://transit.yahoo.co.jp/station/time/22951/?gid=3301&kind=1&done=time"
05:07
05:26
05:38
05:46
05:54
06:02
(省略)

無事に取得できました.ダッシュボードで表示するために,ファイルに出力しておきます.

$ ./parse.rb "https://transit.yahoo.co.jp/station/time/22951/?gid=3301&kind=1&done=time" > hibiya.txt

ダッシュボードへの表示

今回はかなりゴリ押しです.「むこう60分間の時刻表をいい感じに表示する」ようにします.

          <div class="card">
            <h4 class="card-header">時刻表</h4>
            <div class="card-body">
              <%
                data = File.read("hibiya.txt")
                train_data = data.split(/\n/).map{|e| e.chomp}.select{|e| e>Time.now.strftime("%H:%M") && e<(Time.now+60*60).strftime("%H:%M")}
                             .group_by{|e| e[0,2]}.map{|k,v| "<strong>#{k}</strong>#{"&nbsp;"*3}#{v.map{|e| e[3,2]}.join(" ")}"}.join("<br>")
              %>
              <p><%= train_data %></p>
            </div>
          </div>

これで,「次の電車何分だっけ?」というときにスマートフォンを操作せずに確認出来るようになりました.

f:id:no_clock:20180916224413p:plain

補足

今回,土休日や種別(急行など)は考慮していません.


今日はここまで.