ラズパイ電光掲示板/天気予報の表示内容を変えてみる!RaspberryPiで電光掲示板part11
今回は、天気予報の表示をいじくってみようかと考えます。
現在、電光掲示板に表示している天気予報はすべて日本語です。
まあ、それでも実用には何の支障もありませんが、まあ、毎回表示されるモノなので、いくつか変化が欲しくなってきたんです。
テレビの天気予報などでは、お天気はマークで示され、それをみれば一発で、どんな天気かわかるじゃないですか。
電光掲示板にも、それと同じような表示が欲しくなったということです。
そんなこんなで、お天気マークを出すことにチャレンジしていきます。
天気予報の表示内容を変える
電光掲示板への天気予報のスクロール表示ですが、現状は全て日本語表示になっています。
これは、最初、電光掲示板への表示をすることに注力していたためであり、また、勝手もわからないことだらけだったことが、その理由となっています。
今回、新たに、電光掲示板を追加するに当たり、表示内容に変化をつけてみようと思います。
その内容は次の二点です。
① 天気は、日本語から、お天気マークに変更
② 気温は、ある温度を境に色を付けて表示
実現方法
さて、実現方法ですが、次のようにしていきます。
①の「お天気マーク」ですが、Livedoor天気のRSS配信のページにありますので使用します。
- 本日:▼forecasts: > ▼0 > image > url
- 明日:▼forecasts: > ▼1 > image > url
②の「気温」も同じページにあります。表示には、明日のものだけ使用しています。
- 最低気温:▼forecasts: > ▼1 > temperature > min > celsius
- 最高気温:▼forecasts: > ▼1 > temperature > max > celsius
気温は、次のようにしましょう。
- 25℃以上:赤
- 20℃以上:オレンジ
- 10℃以下:青
- 5℃以下:白
- 上記以外:黄
こうするためには、背景と文字色も大事ですね。背景は黒、日時は緑、文字色は黄色でやってみます。
電光掲示板表示までの流れ
以下の手順で実現します。
- 手順1:pythonプログラムで、必要なファイルを作成します。
- 手順2:imagemagick の convertを使用して、image ファイルに変換します。それぞれのファイルを接続します。
- 手順3:作成した imageファイルを電光掲示板に流します。
テロップは、次のようになります。
4月10日、21時38分59秒 神奈川県 横浜 の天気 今日の天気は ■ です。明日の天気は ▼ です。明日の予想最高気温、XX℃、予想最低気温、YY℃です。
- 背景 :文字色 黒
- 日時~の天気 :文字色 緑
- 今日の天気は~です:文字色 黄
- ■、▼ :お天気マーク
- XX℃、YY℃ :気温による色替え(2.参照)
手順1の詳細
pythonプログラムで、それぞれのファイルを作成します。イメージファイルの形式は、お天気マークの関係で gif とします。
- ファイル1 テキストファイル 内容:日時+「 神奈川県 横浜 の天気 」
- ファイル2 テキストファイル 内容:「今日の天気は」
- ファイル3 イメージファイル 内容:本日のお天気マーク
- ファイル4 テキストファイル 内容:「です。明日の天気は」
- ファイル5 イメージファイル 内容:明日のお天気マーク
- ファイル6 テキストファイル 内容:「です。明日の予想最高気温、」
- ファイル7 イメージファイル 内容:「最高気温+℃」を該当の文字色
- ファイル8 テキストファイル 内容:「、予想最低気温、」
- ファイル9 イメージファイル 内容:「最低気温+℃」を該当の文字色
- ファイル10 テキストファイル 内容:「です。」
手順2の詳細
次の二つの作業を行います。
イメージファイル作成
作成したテキストファイルを convert文を使用して、イメージファイルを作成します。
お天気マークは、サイズが少し大きいので、他のイメージファイルと同様の大きさに変換します。
イメージファイル接続
作成したイメージファイルを接続します。
手順3の詳細
サンプルプログラム image-scroller.py を使用して、作成された imageファイルを電光掲示板に流します。
勉強になったところ
60爺は、根を詰めてやらないので、なかなか熟練者になれませんが、pythonのプログラミングで勉強になった部分が下記の四点です。
pythonでのファイル出力
f = open(name,'w')
f.write(naiyo)
f.close()
pythonからのコマンド発行
いろいろやり方がありましたが、これが一番簡単でした。
cmd = "convert -background black -fill %s -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:%s℃ /home/pi/work/%s.gif" % (color,ondo , file)
try:
res = subprocess.call( cmd.strip().split(" ") )
except:
print("Error. test")
pythonでの型変換
max_temp = temperature['max']['celsius']
※この段階では、max_tempは、文字列となる
そのため、気温の判定では、int型として扱うようにする
if int(max_temp) >= 25:
img_file_out("red", max_temp, "file7")・・・
引数を使用して関数を使う
def file_out(name,naiyo):
f = open(name,'w')
f.write(naiyo)
呼び出し側
file8_text = '、予想最低気温 '
file_out("/home/pi/work/file8.txt",file8_text)
表示結果
以下のようになりました。当初のものより、インパクトがありますかね。ご覧ください。
ソースプログラムとシェル
最後に、ソースプログラムとシェルを載せておきます。
ソースプログラム
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from datetime import datetime
import urllib.request
import json
import subprocess
def main():
print ('start')
txt_weather()
return
def file_out(name,naiyo):
f = open(name,'w')
f.write(naiyo)
f.close()
return
def img_file_out(color, ondo, file):
print(color,ondo,file)
cmd = "convert -background black -fill %s -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:%s℃ /home/pi/work/%s.gif" % (color, ondo , file)
try:
res = subprocess.call( cmd.strip().split(" ") )
except:
print("Error. test")
return
def txt_weather():
city = '140010'; # Yokohama
print (city)
json_url = 'https://weather.livedoor.com/forecast/webservice/json/v1'
#API URL
weather_text = u'%sの天気は'
temperature_text = u'です。%sの予想最高気温、%s℃、予想最低気温、%s℃です。'
file6_text = 'です。明日の予想最高気温 '
file8_text = '、予想最低気温 '
file10_text = 'です。'
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]
image = cast['image']
today_w_txt = weather_text % (cast['dateLabel'])
today_w_url = image['url']
today_name = "/home/pi/work/file3.gif"
urllib.request.urlretrieve(today_w_url, today_name)
# TOMMOROW
cast = forecasts[1]
temperature = cast['temperature']
image = cast['image']
tommorow_w_txt = weather_text % (cast['dateLabel'])
tommorow_w_gif = urllib.request.urlopen(image['url'])
tommorow_w_url = image['url']
tommorow_name = "/home/pi/work/file5.gif"
urllib.request.urlretrieve(tommorow_w_url, tommorow_name)
max_temp = temperature['max']['celsius']
min_temp = temperature['min']['celsius']
# text_file set & out
file1_text = text_day + ' ' + title + ' '
file2_text = today_w_txt + ' '
file4_text = file10_text + tommorow_w_txt + ' '
file_out("/home/pi/work/file1.txt",file1_text)
file_out("/home/pi/work/file2.txt",file2_text)
file_out("/home/pi/work/file4.txt",file4_text)
file_out("/home/pi/work/file6.txt",file6_text)
file_out("/home/pi/work/file8.txt",file8_text)
file_out("/home/pi/work/file10.txt",file10_text)
# max temp file7
if int(max_temp) >= 25:
img_file_out("red", max_temp, "file7")
elif int(max_temp) >= 20:
img_file_out("orange", max_temp, "file7")
else:
img_file_out("yellow", max_temp, "file7")
# mix temp file9
if int(min_temp) < 5:
img_file_out("white", min_temp, "file9")
elif int(min_temp) < 10:
img_file_out("blue", min_temp, "file9")
else:
img_file_out("yellow", min_temp, "file9")
finally:
r.close()
return
### Execute
if __name__ == "__main__":
main()
シェル
# file product
python3 /home/pi/python-pg/tenki_file.py
# text --> gif
convert -background black -fill green -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file1.txt /home/pi/work/file1.gif
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file2.txt /home/pi/work/file2.gif
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file4.txt /home/pi/work/file4.gif
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file6.txt /home/pi/work/file6.gif
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file8.txt /home/pi/work/file8.gif
convert -background black -fill yellow -font /usr/share/fonts/truetype/fonts-japanese-gothic.ttf -pointsize 16 label:@/home/pi/work/file10.txt /home/pi/work/file10.gif
echo "convert end"
# gif1 add border
convert -border 1x1 -bordercolor red /home/pi/work/file1.gif /home/pi/work/file1_border.gif
echo "add border end"
# gif --> size change
convert /home/pi/work/file1_border.gif -resize x16 /home/pi/work/file1_border1.gif
convert /home/pi/work/file3.gif -resize x16 /home/pi/work/file3_2.gif
convert /home/pi/work/file5.gif -resize x16 /home/pi/work/file5_2.gif
echo "size change end"
# file add
convert +append /home/pi/work/file1_border1.gif /home/pi/work/file2.gif /home/pi/work/file3_2.gif /home/pi/work/file4.gif /home/pi/work/file5_2.gif /home/pi/work/file6.gif /home/pi/work/file7.gif /home/pi/work/file8.gif /home/pi/work/file9.gif /home/pi/work/file10.gif /home/pi/work/tenki.gif
# imagescroller
#/home/pi/rpi-rgb-led-matrix/bindings/python/samples/stopafter 10 sudo python3 /home/pi/rpi-rgb-led-matrix/bindings/python/samples/image-scroller.py -r 16 --led-no-hardware-pulse yes -c 2 --led-slowdown-gpio 0 -i /home/pi/work/tenki.gif
/home/pi/rpi-rgb-led-matrix/bindings/python/samples/stopafter 60 sudo python3 /home/pi/rpi-rgb-led-matrix/bindings/python/samples/image-scroller.py -r 16 --led-no-hardware-pulse yes -c 2 -i /home/pi/work/tenki.gif
#demo run for LED PANEL reset
sudo /home/pi/rpi-rgb-led-matrix/examples-api-use/demo -D 1 -t 5 /home/pi/rpi-rgb-led-matrix/examples-api-use/runtext16.ppm --led-rows=16 --led-no-hardware-pulse --led-chain=2
※最後のLED PANEL resetは、直前のimagescrollerが止まった段階で、電光掲示板に不要な形で残ってしまうものをリセットするため、Hello Worldを流しています。
最後に
今回は、天気予報の表示をいじくってみました。
電光掲示板に表示している天気予報はすべて日本語でしたが、毎回表示されるモノなので、いくつか変化が欲しくなってきたんです。
そこで、テレビの天気予報などでなされる、お天気マークを電光掲示板で出すよう対策しました。
合わせて気温も、温度によって色を変えるようにしました。
そこそこ、うまく行ったのではないかと思います。
※気づけば電光掲示板の記事も増えてきました
ディスカッション
コメント一覧
まだ、コメントがありません