天気予報を電光掲示板に表示! ラズパイで電光掲示板 part4
ラズパイで電光掲示板の記事も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
ディスカッション
コメント一覧
まだ、コメントがありません