ラズパイ電光掲示板/天気予報の表示内容を変えてみる!RaspberryPiで電光掲示板part11

2018年6月4日

今回は、天気予報の表示をいじくってみようかと考えます。

現在、電光掲示板に表示している天気予報はすべて日本語です。

まあ、それでも実用には何の支障もありませんが、まあ、毎回表示されるモノなので、いくつか変化が欲しくなってきたんです。

テレビの天気予報などでは、お天気はマークで示され、それをみれば一発で、どんな天気かわかるじゃないですか。

電光掲示板にも、それと同じような表示が欲しくなったということです。

そんなこんなで、お天気マークを出すことにチャレンジしていきます。

スポンサーリンク

天気予報の表示内容を変える

電光掲示板への天気予報のスクロール表示ですが、現状は全て日本語表示になっています。

これは、最初、電光掲示板への表示をすることに注力していたためであり、また、勝手もわからないことだらけだったことが、その理由となっています。

今回、新たに、電光掲示板を追加するに当たり、表示内容に変化をつけてみようと思います。

その内容は次の二点です。
① 天気は、日本語から、お天気マークに変更

② 気温は、ある温度を境に色を付けて表示

実現方法

さて、実現方法ですが、次のようにしていきます。

①の「お天気マーク」ですが、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を流しています。

最後に

今回は、天気予報の表示をいじくってみました。

電光掲示板に表示している天気予報はすべて日本語でしたが、毎回表示されるモノなので、いくつか変化が欲しくなってきたんです。

そこで、テレビの天気予報などでなされる、お天気マークを電光掲示板で出すよう対策しました。

合わせて気温も、温度によって色を変えるようにしました。

そこそこ、うまく行ったのではないかと思います。

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

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

60爺

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

電光掲示板

Posted by 60爺