気象庁の提供する天気情報に読み仮名を振る

# ラズパイで天気予報

ラズパイに 20x4 のディスプレイをつないで天気予報を表示します
こんな感じの予定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102797/32e6824a-7424-2077-c062-e5177c39f321.png)

(追記) 完成しました

https://qiita.com/Tomonobu3110/items/40fd60a14a93bd2bfc2c

# データ取得

天気予報は気象庁から取得します
このようなURLからjsonがとれます。素晴らしいです
https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json

jsonの例です

```json
[
	{
		"publishingOffice": "気象庁",
		"reportDatetime": "2023-07-26T17:00:00+09:00",
		"timeSeries": [
			{
				"timeDefines": [
					"2023-07-26T17:00:00+09:00",
					"2023-07-27T00:00:00+09:00",
					"2023-07-28T00:00:00+09:00"
				],
				"areas": [
					{
						"area": {
							"name": "東京地方",
							"code": "130010"
						},
						"weatherCodes": [
							"100",
							"100",
							"100"
						],
						"weathers": [
							"晴れ",
							"晴れ　多摩西部　では　昼過ぎ　から　雨　で　雷を伴う",
							"晴れ"
						],
```

```weatherCodes``` と ```weathers``` に天気情報が入っています
```weathers``` は日本語かつ長い(ときもある)ので、```weatherCodes``` を使います

気象庁のjsonについては以下のblogなどを参考にしました

https://anko.education/webapi/jma

# 天気コードと "読み" への変換

コードは天気に対応していて、例えば **100** は **晴れ** です
対応表は、 ```Forcast.Const.TELOPS``` という変数で提供？されていて
気象庁の天気予報のページから取得できます

(追記) ```Forecat.Const.TELOPS``` の入手手順です
1. https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=130000 をブラウザでひらく
1. F12を押してデベロッパーツールを起動し、コンソールを表示
1. ```Forecast.Const.TELOPS``` を入力
1. 右クリックして「object をコピー」、テキストエディタでペースト

https://qiita.com/youtoy/items/932bc48b03ced5a45c71

内容はこのようなjson形式のデータになっています

```json
{
    "100": [
        "100.svg",
        "500.svg",
        "100",
        "晴",
        "CLEAR"
    ],
    "101": [
        "101.svg",
        "501.svg",
        "100",
        "晴時々曇",
        "PARTLY CLOUDY"
    ],
    "102": [
        "102.svg",
        "502.svg",
        "300",
        "晴一時雨",
        "CLEAR, OCCASIONAL SCATTERED SHOWERS"
    ],
```

4番目に比較的短い日本語で天気が記載されています

ラズパイのディスプレイはカタカナしか表示できないので、
日本語(漢字) から 読み に変換します

変換は「[よみたん](https://yomi-tan.jp/)」というサイトが提供するAPIを利用させていただくことにしました

https://yomi-tan.jp/man/v1

※ 利用規約に呼び出し回数条件など記載があります。ご注意ください

> ・原則として、**非商用の使用に限り無料**でご利用いただけます(アフィリエイトは可)。商用・企業内でのAPI利用は有料となります。
> ・**1日の検索数が10,000を超える利用は、商用・非商用に関わらず有料**となります。

# プログラム・コード (Python)

変換のために作ったプログラムです
半分以上 ChatGPT が作ったのは内緒です
```TELOPS.json``` は ```Forcast.Const.TELOPS``` の内容を保存したファイルです

```Python
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
import urllib

# JSONファイルを読み込む
file_path = "TELOPS.json"
with open(file_path, "r") as json_file:
    data = json.load(json_file)

# アイテムを取り出す
items = []
for key, value in data.items():
    # key: "100", "101", ...
    # value: ["100.svg", "500.svg", "100", "晴", "CLEAR"], ...

    # アイテムの値を取り出す
    item_id = key
    svg_file1, svg_file2, code, description_jp, description_en = value

    # アイテムの情報を表示
    #print(u"ID: {}".format(item_id))
    #print(u"SVG Files: {}, {}".format(svg_file1, svg_file2))
    #print(u"Code: {}".format(code))
    #print(u"Description (JP): {}".format(description_jp))
    #print(u"Description (EN): {}".format(description_en))
    #print(u"-" * 30)
    
    webenc = urllib.quote(description_jp.encode("utf-8"))
    url = "https://yomi-tan.jp/api/yomi.php?ic=UTF-8&oc=UTF-8&k=k&n=1&t=" + webenc
    #print(url)

    response = requests.get(url, verify=False)
    str = key + "," + description_jp + "," + response.text
    print(str)
    items.append(str)

# 最初の数字をキーとしてソートする
sorted_data = sorted(items, key=lambda x: int(x.split(",")[0]))

# ソート結果を表示
for item in sorted_data:
    print(item)
```

# 成果物
読みの正解率は100%ではないので、データを手で修正しました

以下に、成果物を共有しておきます
CSVで
WeatherCode, 天気(漢字), 天気(読み - カタカナ)
となっています
見ればわかるか

```text
100,晴,ハレ
101,晴時々曇,ハレトキドキクモリ
102,晴一時雨,ハレイチジアメ
103,晴時々雨,ハレトキドキアメ
104,晴一時雪,ハレイチジユキ
105,晴時々雪,ハレトキドキユキ
106,晴一時雨か雪,ハレイチジアメカユキ
107,晴時々雨か雪,ハレトキドキアメカユキ
108,晴一時雨か雷雨,ハレイチジアメカライウ
110,晴後時々曇,ハレノチトキドキクモリ
111,晴後曇,ハレノチクモリ
112,晴後一時雨,ハレノチイチジアメ
113,晴後時々雨,ハレノチトキドキアメ
114,晴後雨,ハレノチアメ
115,晴後一時雪,ハレノチイチジユキ
116,晴後時々雪,ハレノチトキドキユキ
117,晴後雪,ハレノチユキ
118,晴後雨か雪,ハレノチアメカユキ
119,晴後雨か雷雨,ハレノチアメカライウ
120,晴朝夕一時雨,ハレアサユウイチジアメ
121,晴朝の内一時雨,ハレアサノウチイチジアメ
122,晴夕方一時雨,ハレユウガタイチジアメ
123,晴山沿い雷雨,ハレヤマゾイライウ
124,晴山沿い雪,ハレヤマゾイユキ
125,晴午後は雷雨,ハレゴゴハライウ
126,晴昼頃から雨,ハレヒルゴロカラアメ
127,晴夕方から雨,ハレユウガタカラアメ
128,晴夜は雨,ハレヨルハアメ
130,朝の内霧後晴,アサノウチキリノチハレ
131,晴明け方霧,ハレアケガタキリ
132,晴朝夕曇,ハレアサユウクモリ
140,晴時々雨で雷を伴う,ハレトキドキアメデカミナリヲトモナウ
160,晴一時雪か雨,ハレイチジユキカアメ
170,晴時々雪か雨,ハレトキドキユキカアメ
181,晴後雪か雨,ハレノチユキカアメ
200,曇,クモリ
201,曇時々晴,クモリトキドキハレ
202,曇一時雨,クモリイチジアメ
203,曇時々雨,クモリトキドキアメ
204,曇一時雪,クモリイチジユキ
205,曇時々雪,クモリトキドキユキ
206,曇一時雨か雪,クモリイチジアメカユキ
207,曇時々雨か雪,クモリトキドキアメカユキ
208,曇一時雨か雷雨,クモリイチジアメカライウ
209,霧,キリ
210,曇後時々晴,クモリノチトキドキハレ
211,曇後晴,クモリノチハレ
212,曇後一時雨,クモリノチイチジアメ
213,曇後時々雨,クモリノチトキドキアメ
214,曇後雨,クモリノチアメ
215,曇後一時雪,クモリノチイチジユキ
216,曇後時々雪,クモリノチトキドキユキ
217,曇後雪,クモリノチユキ
218,曇後雨か雪,クモリノチアメカユキ
219,曇後雨か雷雨,クモリノチアメカライウ
220,曇朝夕一時雨,クモリアサユウイチジアメ
221,曇朝の内一時雨,クモリアサノウチイチジアメ
222,曇夕方一時雨,クモリユウガタイチジアメ
223,曇日中時々晴,クモリニッチュウトキドキハレ
224,曇昼頃から雨,クモリヒルゴロカラアメ
225,曇夕方から雨,クモリユウガタカラアメ
226,曇夜は雨,クモリヨルハアメ
228,曇昼頃から雪,クモリヒルゴロカラユキ
229,曇夕方から雪,クモリユウガタカラユキ
230,曇夜は雪,クモリヨルハユキ
231,曇海上海岸は霧か霧雨,クモリカイジョウカイガンハキリカキリサメ
240,曇時々雨で雷を伴う,クモリトキドキアメデカミナリヲトモナウ
250,曇時々雪で雷を伴う,クモリトキドキユキデカミナリヲトモナウ
260,曇一時雪か雨,クモリイチジユキカアメ
270,曇時々雪か雨,クモリトキドキユキカアメ
281,曇後雪か雨,クモリノチユキカアメ
300,雨,アメ
301,雨時々晴,アメトキドキハレ
302,雨時々止む,アメトキドキヤム
303,雨時々雪,アメトキドキユキ
304,雨か雪,アメカユキ
306,大雨,オオアメ
308,雨で暴風を伴う,アメデボウフウヲトモナウ
309,雨一時雪,アメイチジユキ
311,雨後晴,アメノチハレ
313,雨後曇,アメノチクモリ
314,雨後時々雪,アメノチトキドキユキ
315,雨後雪,アメノチユキ
316,雨か雪後晴,アメカユキノチハレ
317,雨か雪後曇,アメカユキノチクモリ
320,朝の内雨後晴,アサノウチアメノチハレ
321,朝の内雨後曇,アサノウチアメノチクモリ
322,雨朝晩一時雪,アメアサバンイチジユキ
323,雨昼頃から晴,アメヒルゴロカラハレ
324,雨夕方から晴,アメユウガタカラハレ
325,雨夜は晴,アメヨルハハレ
326,雨夕方から雪,アメユウガタカラユキ
327,雨夜は雪,アメヨルハユキ
328,雨一時強く降る,アメイチジツヨクフル
329,雨一時みぞれ,アメイチジミゾレ
340,雪か雨,ユキカアメ
350,雨で雷を伴う,アメデカミナリヲトモナウ
361,雪か雨後晴,ユキカアメノチハレ
371,雪か雨後曇,ユキカアメノチクモリ
400,雪,ユキ
401,雪時々晴,ユキトキドキハレ
402,雪時々止む,ユキトキドキヤム
403,雪時々雨,ユキトキドキアメ
405,大雪,オオユキ
406,風雪強い,フウセツツヨイ
407,暴風雪,ボウフウセツ
409,雪一時雨,ユキイチジアメ
411,雪後晴,ユキノチハレ
413,雪後曇,ユキノチクモリ
414,雪後雨,ユキノチアメ
420,朝の内雪後晴,アサノウチユキノチハレ
421,朝の内雪後曇,アサノウチユキノチクモリ
422,雪昼頃から雨,ユキヒルゴロカラアメ
423,雪夕方から雨,ユキユウガタカラアメ
425,雪一時強く降る,ユキイチジツヨクフル
426,雪後みぞれ,ユキノチミゾレ
427,雪一時みぞれ,ユキイチジミゾレ
450,雪で雷を伴う,ユキデカミナリヲトモナウ
```

以上です