デジタルフォトフレームを簡易モニターとして使う(週間天気予報)


前回に引き続きWEBページから必要な情報を抜き出してフォトフレームに表示する方法を 紹介します。
今回はlivedoorの Weather HacksのRSSフィードのページから、週間天気予報を抜き出してフォトフレームに表示します。

なお、この記事を書くにあたって、以下のページを参考にさせていただきました。
Rubyで天気 予報を取得するスクリプト「tenki.rb」を公開します。
この場を借りてお礼申し上げます。

【STEP1】pythonスクリプト

スクリプトは以下のとおりです。

#!/usr/bin/python
#-*- encoding: utf-8 -*-
import sys
import os
import csv
import urllib2
import BeautifulSoup
import unicodedata

if __name__ == '__main__':
    argv = sys.argv  # コマンドライン引数を格納したリストの取得
    argc = len(argv) # 引数の個数
    CurDir=argv[0]
    DirName=os.path.dirname(CurDir)
    if not DirName:
        DirName="."
    csv_file=DirName+"/param.csv"
#
#テストモード設定
    TestMode=""
    if argc == 2:
        if argv[1] == "test":
            TestMode="test"

#フォントサイズなど
#適当に変更してください
    FontSizeHeader="180"
    FontSizeBody="100"
    FontStyleHeader="G"
    FontStyleBody="M"
    FillColorHeader="DarkBlue"
    FillColorBody="Black"
#
#CSVファイル作成
    fd=open(csv_file,'w')
    writer = csv.writer(fd, lineterminator='\n')
    csvdata=[]
#
#週間天気予報を取得
    city = '230010' # 名古屋
    url = 'http://weather.livedoor.com/forecast/rss/area/{0:s}.xml'.format(city)
    opener = urllib2.build_opener()
    contents = opener.open( url ).read()
    soup = BeautifulSoup.BeautifulSoup(contents)
#
#地域情報を抽出
    for item in soup.find("title"):
        text=str(item)
        list=text.split("livedoor")
        csvline=str(list[0])
        if TestMode:
            print csvline
        csvdata.append(csvline)
        csvdata.append(FontSizeHeader)
        csvdata.append(FillColorHeader)
        csvdata.append(FontStyleHeader)
        writer.writerow(csvdata)
        del csvdata[:]
        csvline=""
        csvdata.append(csvline)
        csvdata.append(FontSizeHeader)
        csvdata.append(FillColorHeader)
        csvdata.append(FontStyleHeader)
        writer.writerow(csvdata)
        del csvdata[:]
#
#天気予報を抽出
    for item in soup.findAll("description"):
        text=str(item)
        if text[13:15].isdigit():
            list=text.split("<description>")
            text=str(list[1])
            del list[:]
            list=text.split("</description>")
            text=str(list[0])
            del list[:]
            list=text.split("の天気は")
            csvline=str(list[0])
            text=str(list[1])
            del list[:]
            list=text.split("、")
            csvline=csvline+str(list[0])+' '
            text=str(list[1])
            del list[:]
            list=text.split("は")
            csvline=csvline+str(list[0])
            if len(list) == 2:
                text=str(list[1])
            if len(list) == 3:
                csvline=csvline+str(list[1])
                text=str(list[2])
            del list[:]
            list=text.split("でしょう。")
            csvline=csvline+str(list[0])
            if TestMode:
                print csvline
            csvdata.append(csvline)
            csvdata.append(FontSizeBody)
            csvdata.append(FillColorBody)
            csvdata.append(FontStyleBody)
            writer.writerow(csvdata)
            del csvdata[:]
    fd.close()

split()関数を使うと、文字列の中からカンタンに必要な場所だけを取り出すことができます。
上記のスクリプトを「weekly.py」などのファイル名で保存してください。
なお、スクリプトの以下の部分はお住まいの地域にあわせて変更してください。
city = '230010' # 名古屋

ここの ページで地域を選ぶとURLが表示されますので、URLの末尾の6桁の数字を指定します。

【STEP2】pythonスクリプトの実行

起動時の引数に「test」を指定すると、以下の様に指定した地域の週間天気予報が表示されます。

$ python weekly.py test
愛知県 - 名古屋の天気 -
29日(月)曇のち晴 最高気温11℃
30日(火)晴時々曇 最高気温11℃ 最低気温3℃
31日(水)晴のち雨 最高気温11℃ 最低気温2℃
01日(木)曇時々雪 最高気温6℃ 最低気温1℃
02日(金)曇り 最高気温5℃ 最低気温-2℃
03日(土)曇時々晴 最高気温7℃ 最低気温-1℃
04日(日)晴時々曇 最高気温10℃ 最低気温1℃
05日(月)晴時々曇 最高気温11℃ 最低気温3℃

同時にカレントディレクトリに「param.csv」のファイルが作られます。

$ cat param.csv
愛知県 - 名古屋の天気 - ,60,DarkBlue,G
,60,DarkBlue,G
29日(月)曇のち晴 最高気温11℃ ,33,Black,M
30日(火)晴時々曇 最高気温11℃ 最低気温3℃,33,Black,M
31日(水)晴のち雨 最高気温11℃ 最低気温2℃,33,Black,M
01日(木)曇時々雪 最高気温6℃ 最低気温1℃,33,Black,M
02日(金)曇り 最高気温5℃ 最低気温-2℃,33,Black,M
03日(土)曇時々晴 最高気温7℃ 最低気温-1℃,33,Black,M
04日(日)晴時々曇 最高気温10℃ 最低気温1℃,33,Black,M
05日(月)晴時々曇 最高気温11℃ 最低気温3℃,33,Black,M

出来上がったパラメータファイル(param.csv)を使って、前回と同様の手順でイメージファイルを作成し、
イメージファイルをフォトフレーム側にダウンロードしてやれば、フォトフレームに週間天気予報を表示することができます。

【STEP3】全体のシェルスクリプト

cronで1日1回、以下のスクリプトを実行すれば、フォトフレームに週間天気予報を表示することができます。

#!/bin/bash
#
#Weekly Weather Report for Raspberry
#
python /home/pi/weekly.py
/home/pi/fusen.sh /home/pi/param.csv /home/pi/back.jpg /tmp/out.jpg → こちらで紹介した スクリプト
/home/pi/download.sh → こちらで 紹介したスクリプト

フォトフレームへの表示は以下の様になります。

Transcend PF710の場合

次回は、WEBページからイメージファイルを抜き出して表示する方法を紹介する予定で す。