はじめに
Raspberry Pi Pico Wや2 W向けのMachiKania Type-PはWi-Fiが使用でき、HTTPやHTTPSによるWebサイトアクセスが可能なので気象庁が公開している天気概況データの取得と表示を試してみた結果をまとめました。
検証環境
以下の環境でプログラムの作成と検証を行ないました。
- macOS : Tahoe 26.0
- PicoCalc : Raspberry Pi Pico 2 W
-MachiKania : Phyllosoma 1.6.0
気象庁天気概況文
天気概況文のURL
気象庁の公開している天気概況文は次のURLからJSON形式で取得できます。
https://www.jma.go.jp/bosai/forecast/data/overview_forecast/府県予報区コード.json
府県予報区コードはGeoshapeリポジトリ - 地理形状データ共有サイトから確認できます。
URLにコードを当てはめてブラウザで表示するとJSON形式のデータが表示されます。
- 東京都は130000: https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json
- 鹿児島県(奄美地方除く)は460100:https://www.jma.go.jp/bosai/forecast/data/overview_forecast/460100.json
天気概況文の内容
wgetコマンドを使えばJSON形式データをダウンロードできます。たとえば、鹿児島県(奄美地方除く)のデータをダウンロードします。
$ wget https://www.jma.go.jp/bosai/forecast/data/overview_forecast/460100.json
--2025-09-24 14:13:35-- https://www.jma.go.jp/bosai/forecast/data/overview_forecast/460100.json
www.jma.go.jp (www.jma.go.jp) をDNSに問いあわせています... 143.204.80.20, 143.204.80.76, 143.204.80.101, ...
www.jma.go.jp (www.jma.go.jp)|143.204.80.20|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1975 (1.9K) [application/json]
`460100.json' に保存中
460100.json 100%[===========================================>] 1.93K --.-KB/s 時間 0s
2025-09-24 14:13:35 (235 MB/s) - `460100.json' へ保存完了 [1975/1975]
ダウンロードしたJSON形式の天気概況文のキーをjqコマンドで確認すると下記の5つがあることが分かります。
$ cat 460100.json | jq keys
[
"headlineText",
"publishingOffice",
"reportDatetime",
"targetArea",
"text"
キーと値はブラウザでも表示されますが読みづらいのでjqコマンドで整形して表示してみます。キーtextの値の文字列が天気概況文であることが分かります。改行位置に\nの2文字が置かれていることが分かります。表示は読みやすいように適宜改行しています。
$ cat 460100.json | jq
{
"publishingOffice": "鹿児島地方気象台",
"reportDatetime": "2025-09-24T10:41:00+09:00",
"targetArea": "鹿児島県",
"headlineText": "",
"text": " 薩摩、大隅、種子島・屋久島地方は、湿った空気の影響によりおおむね曇りで激
しい雨が降っている所があります。24日は、湿った空気の影響によりおおむね曇りで雷を伴
い激しい雨が降る所があるでしょう。25日は、湿った空気の影響により雨や曇りで雷を伴い
激しく降る所がある見込みです。24日から25日にかけては、雨雲の発達の程度によっては
大雨となるおそれがあります。\n\n 奄美地方は、高気圧に覆われて晴れていますが、湿った
空気の影響により曇りで雨が降っている所があります。24日は、高気圧に覆われて晴れとな
りますが、湿った空気の影響により曇りで雨や雷雨となる所があるでしょう。25日は、高気
圧に覆われて晴れとなりますが、湿った空気の影響により曇りで雨や雷雨となる所がある見込
みです。\n\n<天気変化等の留意点>\n 薩摩地方の24日は、湿った空気の影響によりおお
むね曇りで雨が降っている所があります。24日から25日にかけては、雨雲の発達の程度に
よっては大雨となるおそれがあります。薩摩地方の25日12時までに予想される24時間降
水量は多い所で100ミリの見込みです。\n 奄美地方の24日は、高気圧に覆われて晴れな
りますが、湿った空気の影響により曇りで雨や雷雨となる所があるでしょう。24日から26
日にかけてうねりを伴った高波に注意してください。奄美地方十島村の25日12時までに予
想される24時間降水量は多い所で60ミリの見込みです。"
}
MachiKaniaのプログラム
気象庁のサイトからJSON形式のデータを取得し、報告日時、対象地域、概況文を取得して表示するプログラムを作ります。MachiKaniaではこれらの機能はクラスライブラリとして提供されています。
| 機能 | 対応するクラスライブラリ |
|---|---|
| WebサイトからJSON形式データの取得 | WGET |
| JSON形式データの処理 | JSON |
| 日本語表示 | CKNJ8、CKNJ12、CKNJ16 |
概況文中の\nを改行コードを実際の改行コード(0x0D)置換するためにSTRINGクラスを使います。
処理の流れは次のとおりです。
- 天気概況文JSON形式データの取得
- 天気概況文から表示するデータを取得
- 取得したデータを表示
クラスライブラリの使用
MachiKaniaで提供されるクラスライブラライはSDカードのルートディレクトリのLIBにあります。ここにあるクラスライブラリを使用するにはUSECLASS命令を使います。日本語表示クラスにはUSEGRAPHIC命令も必要です。今回は12x12のフォントを使用します。
クラスライブラリを使用する宣言部のコードは次のとおりです。
USEGRAPHIC
USECLASS WGET, JSON, STRING, CKNJ12
JSON形式データの取得
JSON形式データをWebサイトから取得するときはWGETクラスのパブリックスタティックメソッドWGET::FORSTRING$に天気概況文のURLを与えて取得し、変数に代入します。
次のコードで鹿児島県(奄美地方除く)の天気概況文を取得しています。
USEVAR URL$
URL$="https://www.jma.go.jp/bosai/forecast/data/overview_forecast/460100.json"
T$=WGET::FORSTRING$(URL$)
JSONデータからキーに対するデータの取得
JSON形式データを取得できたのでキーreportDatetimeから報告日時、キーtargetAreaから対象地域、キーtextから概況文をそれぞれ取得します。
次のコードでJSON文字列からオブジェクトJを作り、SQUERY$メソッドでそれぞれの値を取得しています。日時はISO-8601形式なので日付と時間をSTRFTIME$関数で取得します。
USEVAR RDT$, TA$, OV$
J=NEW(JSON, T$)
RDT$= J.SQUERY$(".reportDatetime")
RDT$= STRFTIME$("%Y-%m-%d %H:%M:%S", RDT$)
TA$ = J.SQUERY$(".targetArea")
OV$ = J.SQUERY$(".text")
概況文中の\nを改行コードに変換
取得した概況文は変数OV$に格納のされていますが改行コードの替わりに\nの2文字が置かれているのでSTRINGクラスのREPLC$メソッドを使って実際の改行コード0x0Dに置換します。
次のコードでSTRINGクラスを使った文字の置換を行なっています。
REPLC$メソッドの2番目の引数に改行コードのCHR$($0D)を当てはめて実行するとエラーにはなりませんが概況文が表示されなかったので変数に代入し、引数に与えています。。
S = NEW(STRING, OV$)
C$ = CHR$($0D)
OV$ = S.REPLC$("\n", C$)
概況文などの表示
概況文、対象地域名は日本語なので日本語表示クラスCKNJ12を使いました。日本語表示のオブジェクトKを生成し、パブリックメソッドGPRTで表示します。GPRTメソッドの引数は表示する文字列、文字列の前面色、文字列の背景色です。
日本語はグラフィックス画面に表示するためグラフィック命令のPOINTで表示位置のX、Y座標を指定します。
K=NEW(CKNJ12,"UTF-8")
POINT 0, 0 : K.GPRT(RDT$, 7, 0)
POINT 0, 13 : K.GPRT(TA$, 3, 0)
POINT 0, 26 : K.GPRT(OV$, 7, 0)
すべてのコード
以下に全体のコードを示します。
USEGRAPHIC
USECLASS WGET, JSON, STRING, CKNJ12
USEVAR URL$
USEVAR RDT$, TA$, OV$
URL$="https://www.jma.go.jp/bosai/forecast/data/overview_forecast/460100.json"
T$=WGET::FORSTRING$(URL$)
J=NEW(JSON, T$)
RDT$= J.SQUERY$(".reportDatetime")
RDT$= STRFTIME$("%Y-%m-%d %H:%M:%S", RDT$)
TA$ = J.SQUERY$(".targetArea")
OV$ = J.SQUERY$(".text")
S = NEW(STRING, OV$)
C$=CHR$($D)
OV$ = S.REPLC$("\n", C$)
K=NEW(CKNJ12,"UTF-8")
POINT 0, 0 : K.GPRT(RDT$, 7, 0)
POINT 0, 13 : K.GPRT(TA$, 3, 0)
POINT 0, 26 : K.GPRT(OV$, 7, 0)
WHILE KEYS()=0:WEND
END
実行結果
以下がRaspberry Pi Pico 2 Wを搭載したPicoCalcでの実行結果です。
概況文が長く、すべてを表示できていません。
最後に
概況文の取得と表示ができるようになりました。画面に表示されないくらいの分量の文字列に対する処理はどうしたら良いのかは今後考える必要がありますね。
