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

2017年9月20日

ラズパイで電光掲示板の記事もpart4となりました。

ここまでは、デモプログラムを実行してきたんですが、少し、実用化しようと、天気予報からとってきた内容を電光掲示板で流そうと思いつきました。

始めに、天気予報のテキストを取得して、それを電光掲示板に流すために、画像化する必要があります。

画像化する方法をあれこれ探っていたんですが、convert命令という便利な命令があって、テキストを入力すると画像化してくれるんです。

勇気百倍、早速、テキスト取得から、画像化に向かうことにしました。

スポンサーリンク

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

天気予報に関しては、現在、openjtalkで定時にスピーカーから流している(参考※1)ので、これをベースに、天気予報だけ出力するように変更します。

これが、そのプログラム 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 = 'https://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度です。

テキストをconvertで変換する

パイプを使って試す

この出力した内容を 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

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

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

ファイル出力後試す

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

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完了

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

その中で、このページ(参考※2)の「 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 が作成されました。中を見てみると、下記の通り、日本語になっていますね。

うん、内容を見ても特に問題はなさそうですね。これを電光掲示板に送れば良さそうです!

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

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

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

うまく動きました。

天気予報を定時に電光掲示板に表示

上記の内容を天気予報のおしゃべり(参考※1)で実施したように、定時に電光掲示板に表示するようにしましょう。

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に変更しました。

ニュースが流れると、電光掲示板がまぶしすぎるので・・。

スポンサーリンク

最後に

今回は、今までやってきたデモプログラムの実行ではなく、少し、実用化の方向へ舵を切りました。

即ち、天気予報の内容を電光掲示板に出してみようと思いついたわけです。

実際、どのようにやるかあれこれ悩んだんですが、convert命令なるコマンドを採用することで実現できました。

やってみれば、何とかなるもんですな。

※気づけば電光掲示板の記事も増えてきました

参考にしたページ
※1ラズパイに時刻と天気予報(横浜)をしゃべらせてみる
※2Unable to run the sample code! Getting errors. Plase Help

スポンサーリンク
この記事を書いた人

60爺

60路を越え、RaspberryPi と出会い、その関係でブログ開設(2017/2~)となりました。始めてみると、コツコツやるのが性に合ってしまい、漢字の記事から家の補修・将棋・windows10関係・別名・言い方などジャンルを拡大して今に至ってます。まだまだ、元気なので新たな話題を見つけて皆様に提供できればと思っています。「プロフィールはこちら

電光掲示板

Posted by 60爺