天気予報を電光掲示板に表示! ラズパイで電光掲示板 part4

シェアする

Pocket

60爺は、天気予報からとってきた内容を電光掲示板で流そうと思いつきました。

1.天気予報をテキストに落とす

天気予報に関しては、現在、openjtalkで定時にスピーカーから流しているので、これをベースとして、標準出力している部分を修正 して、天気予報だけ出力するように変更します。

これが、そのプログラム txt_print.py です。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

from datetime import datetime

import  urllib.request
import json

def main():
    txt_weather()
    return

def txt_weather():
    city = '140010'; # Yokohama
    json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL

    weather_text = u'%sの天気は%sです。'
    temperature_text = u'%sの予想最高気温、%s℃、予想最低気温、%s℃です。'

    try:
        r =  urllib.request.urlopen('%s?city=%s' % (json_url, city) )
        obj = json.loads( r.read().decode('utf-8') )

        title = obj['title']
        forecasts = obj['forecasts']

        d = datetime.now()
        text_day = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
        # TODAY
        cast = forecasts[0]
        today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])

        # TOMMOROW
        cast = forecasts[1]
        temperature = cast['temperature']
        tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        tommorow_t_txt = temperature_text % (cast['dateLabel'], temperature['max']['celsius'], temperature['min']['celsius'])

        # PRINT
        weather_str = title + ' ' + today_w_txt + ' ' + tommorow_w_txt + ' ' + tommorow_t_txt

        text = text_day + weather_str
        print (text)
    finally:
        r.close()

    return


### Execute
if __name__ == "__main__":
    main()

実行するとこうなります。ちゃんと、天気予報の結果がテキストで出力されています。

pi@raspberrypi:~ $ python3 txt_print.py
8月28日、21時0分35秒神奈川県 横浜 の天気 今日の天気は晴のち曇です。 明日の天気は曇のち晴です。 明日の予想最高気温、32度、予想最低気温、26度です。

2.テキストをconvertで変換する

(1) パイプを使って試す

この出力した内容を convert の入力にして出力してみます。

pi@raspberrypi:~ $ python3 txt_print.py | convert -background white -fill blue -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 caption:@ - tenki.jpg

Exception ignored in: <_io.TextIOWrapper name='<stdout>’ mode=’w’ encoding=’UTF-8’>
BrokenPipeError: [Errno 32] Broken pipe

パイプがつながらないってエラーになりますね。

少し、調べたのですが、解決できません。

(2) ファイル出力後試す

仕方がないので、一旦ファイルに出力することにしました。

pi@raspberrypi:~ $ python3 txt_print.py > out.txt
pi@raspberrypi:~ $ cat out.txt
8月28日、11時10分12秒神奈川県 横浜 の天気 今日の天気は曇りです。 明日の天気は曇 時々晴です。 明日の予想最高気温、32度、予想最低気温、25度です。

今度は、正しく表示されました!

① convert実施でエラー発生

このファイルにある内容を、imagemagickの convert文でイメージファイルにすれば いいわけです。

pi@raspberrypi:~ $ convert -background white -fill blue -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@out.txt tenki.jpg

convert: not authorized `@out.txt’ @ error/property.c/InterpretImageProperties/3405.
convert: no images defined `tenki.jpgcd’ @ error/convert.c/ConvertImageCommand/3210.

またまた、変なエラー発生。何じゃこりゃーーーと叫びたいのを我慢して調査を開始します。

② エラー消滅、convert完了

ググってみると、英語のページがたくさんあります。

その中で、このページの「 earney commented on 10 Feb ? edited 」で言っていること をやってみましょう。と、言っても、フムフム、policy.xmlの一部を変更するんですね。

【変更内容】
/etc/ImageMagick-6/policy.xmlファイルの下記の内容を変更します。

<policy domain="path" rights="none" pattern="@*" />

<!-- <policy domain="path" rights="none" pattern="@*" /> -->

で、実行したら、何とエラーが出ず、正常終了!素晴らしい。

pi@raspberrypi:~ $ convert -background white -fill blue -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@out.txt tenki.jpg
pi@raspberrypi:~ $

ちゃんと、tenki.jpgが出来ています。中を見てみました。ちゃんと、日本語になっていますね。

3.天気予報を電光掲示板で表示

それでは、ここで作成した天気予報の内容を電光掲示板で流してみます。

pi@raspberrypi:~/rpi-rgb-led-matrix/python/samples $ sudo python3 image-scroller.py --led-no-hardware-pulse yes -c 2 -r 16 -i /home/pi/tenki.jpg
Press CTRL-C to stop sample

まずは、目標クリアです。それでは、これらをまとめたshellを作って流してみます。

pi@raspberrypi:~/rpi-rgb-led-matrix/python/samples $ cat tenki.sh
python3 /home/pi/txt_print.py > /home/pi/out.txt
convert -background white -fill black -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/out.txt /home/pi/tenki.jpg
/home/pi/rpi-rgb-led-matrix/python/samples/stopafter 30 sudo python3 /home/pi/rpi-rgb-led-matrix/python/samples/image-scroller.py --led-no-hardware-pulse yes -c 2 -r -b 50 16 -i /home/pi/tenki.jpg

実行権限を付加しました。

pi@raspberrypi:~/rpi-rgb-led-matrix/python/samples $ chmod 777 tenki.sh

実行したら、ちゃんと動きました。

pi@raspberrypi:~/rpi-rgb-led-matrix/python/samples $ ./tenki.sh
Press CTRL-C to stop sample

4.天気予報を定時に流れるよう設定

これらを、天気予報のおしゃべりと同じように、定時に、電光掲示板に表示されるようにしましょう。

crontabに、以下のように登録しました。

05 7,10,12,15,19,22 * * * /home/pi/rpi-rgb-led-matrix/python/samples/tenki.sh

これで、7:00、10:00、12:00、15:00、19:00、22:00の5分に、電光掲示板に天気予報が表示されます。

後日、22:00は、就寝する時間とぶつかることが多いので、時間を21:00に変更しました。

ニュースが流れると、部屋がまぶしいんです。

pythonのサンプルを動かす part3はこちら。

ニュースを電光掲示板に流す part5はこちら。

スポンサーリンク

シェアする

フォローする