Python Tkinterとラズパイで自分専用のダッシュボードアプリを作ってみる #2 天気予報を取得して整形する

# 概要
デジタルダッシュボード作成 第二弾。

https://qiita.com/inugami_sayo/items/d01ab5424cc09a82a1e1

の続きです。
今回は天気予報の取得と成型をやってみます。

この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**

# 実装したい内容とか整理
ここでは
・12時間分の天気予報を表示
・7日分の週間天気予報を表示
のデータを作成できるようにします。

12時間分の天気については以下の要素があればいいなと個人的に思います。
- 天気マーク
- 気温
- 降水確率
- 風速

7日分の天気についてはいかが必要だと思います。
- 天気マーク
- 最高気温/最低気温
- 降水確率

## 作ってみる

https://maresaku.wixsite.com/raspberry/post/raspberry-pi-pico-w-micropythonでopen-meteoの天気予報の取得に挑戦しました。

の記事を主に参考にしつつ、自分で必要な情報へと少し変更を加えます。
以下のようになりました。
### 12時間
```python:weather_12hours.py
import time
import ujson
import requests
import datetime

weathercode = {
0 : "☀",
1 : "☀/☁",
2 : "☀/☁",
3 : "☀/☁",
45 : "🌫️",
48 : "🌫️",
51 : "☂",
53 : "☂",
55 : "☂",
56 : "☂",
57 : "☂",
61 : "☔",
63 : "☔",
65 : "☔",
66 : "☔",
67 : "☔",
71 : "☔",
73 : "☔",
75 : "☔",
77 : "☔",
80 : "☂",
81 : "☂",
82 : "☂",
85 : "❄",
86 : "❄",
95 : "⛈",
96 : "⛈",
99 : "⛈",
}

#緯度と経度(xx県xx市)
lat = 'xx.xxxx'
lon = 'xx.xxxx'

# 現在の時間を取得しTZをTokyoとする
tokyo_tz = datetime.timezone(datetime.timedelta(hours=9))
dt = datetime.datetime.now(tokyo_tz)

#daily url
daily_url = "https://api.open-meteo.com/v1/forecast?latitude=" + lat + "&longitude=" + lon + "&hourly=weathercode,temperature_2m,precipitation_probability,wind_speed_10m&timezone=Asia%2FTokyo"

json_data = requests.get(daily_url)
#print(json_data.json())

i = int(dt.hour)
Hour = []
Weather = []
Temp = []
Pops = []
Wind = []
for i in range(i,i+12,1):
    #日付
    hour = [str(json_data.json().get('hourly').get('time')[i])]
    Hour = Hour+ hour
    #天気
    weather = [weathercode[int(json_data.json().get('hourly').get('weathercode')[i])]]
    Weather = Weather + weather
    #気温
    temp = [str(json_data.json().get('hourly').get('temperature_2m')[i])]
    Temp = Temp + temp
    #最大降水確率
    pops = [str(json_data.json().get('hourly').get('precipitation_probability')[i])]
    Pops = Pops + pops
    #風速
    wind = [str(json_data.json().get('hourly').get('wind_speed_10m')[i])]
    Wind = Wind + wind

#出力
j = 0
for j in range(12):
    print("[" + Hour[j] + "]")
    print(" 天気: " + Weather[j])
    print(" 温度(C): " + Temp[j] )
    print(" 降水確率(%): " + Pops[j])
    print(" 風速(m): " + Wind[j])
```
こちらを実行すると以下のような結果を得られます
```
at 21:02:36 ⬢ [Docker] ❯ python weather_12hours.py

[2024-01-14T21:00]
 天気: ☀
 温度(C): 5.8
 降水確率(%): 0
 風速(m): 9.0
[2024-01-14T22:00]
 天気: ☀
 温度(C): 4.0
 降水確率(%): 0
 風速(m): 6.0
... ...
[2024-01-15T07:00]
 天気: ☀
 温度(C): 2.5
 降水確率(%): 0
 風速(m): 9.2
[2024-01-15T08:00]
 天気: ☀
 温度(C): 3.3
 降水確率(%): 0
 風速(m): 8.5
```

### 週間天気
```python
import time
import ujson
import requests
import datetime

weathercode = {
0 : "☀",
1 : "☀/☁",
2 : "☀/☁",
3 : "☀/☁",
45 : "🌫️",
48 : "🌫️",
51 : "☂",
53 : "☂",
55 : "☂",
56 : "☂",
57 : "☂",
61 : "☔",
63 : "☔",
65 : "☔",
66 : "☔",
67 : "☔",
71 : "☔",
73 : "☔",
75 : "☔",
77 : "☔",
80 : "☂",
81 : "☂",
82 : "☂",
85 : "❄",
86 : "❄",
95 : "⛈",
96 : "⛈",
99 : "⛈",
}

#緯度と経度(zzz県zzzz市)
lat = 'zz.zzzz'
lon = 'zz.zzzz'

# 現在の時間を取得しTZをTokyoとする
tokyo_tz = datetime.timezone(datetime.timedelta(hours=9))
dt = datetime.datetime.now(tokyo_tz)

#daily url
daily_url = "https://api.open-meteo.com/v1/forecast?latitude=" + lat + "&longitude=" + lon + "&daily=weather_code,temperature_2m_max,temperature_2m_min,precipitation_probability_max&timezone=Asia%2FTokyo"

json_data = requests.get(daily_url)
#print(json_data.json())

i = 0
Date = []
Weather = []
Temp_max = []
Temp_min = []
Pops_max = []
for i in range(7):
    #日付
    date = [str(json_data.json().get('daily').get('time')[i])]
    Date = Date + date
    #天気
    weather = [weathercode[int(json_data.json().get('daily').get('weather_code')[i])]]
    Weather = Weather + weather
    #最高気温
    temp_max = [str(json_data.json().get('daily').get('temperature_2m_max')[i])]
    Temp_max = Temp_max + temp_max
    #最低気温
    temp_min = [str(json_data.json().get('daily').get('temperature_2m_min')[i])]
    Temp_min = Temp_min + temp_min
    #最大降水確率
    pops_max = [str(json_data.json().get('daily').get('precipitation_probability_max')[i])]
    Pops_max = Pops_max + pops_max

#出力
j = 0
for j in range(7):
    print("[" + Date[j] + "]")
    print(" " + Weather[j])
    print(" 温度(C): " + Temp_max[j] + "/" + Temp_min[j] )
    print(" 最大降水確率(%): " + Pops_max[j])

```
こちらを実行すると以下のような結果を得られます
```
at 21:02:50 ⬢ [Docker] ❯ python weather_7days.py  

[2024-01-14]
 ☀
 温度(C): 8.6/-2.8
 最大降水確率(%): 0
[2024-01-15]
 ☀
 温度(C): 8.7/1.1
 最大降水確率(%): 0
[2024-01-16]
 ☀
 温度(C): 5.0/-2.5
 最大降水確率(%): 0
[2024-01-17]
 ☀/☁
 温度(C): 10.1/-2.3
 最大降水確率(%): 0
[2024-01-18]
 ☀/☁
 温度(C): 12.6/-0.6
 最大降水確率(%): 0
[2024-01-19]
 ☔
 温度(C): 9.5/5.7
 最大降水確率(%): 26
[2024-01-20]
 ☔
 温度(C): 8.3/2.7
 最大降水確率(%): 16
```

とりあえず完成！
ファイルをどうやって連携するかとか、データをどうやって取り出すかはあとから考えます。
修正することになっても基本的な部分はできているのでそこまで時間はかからないと思います。

# 次やりたいこと
- カレンダーと時計を作成