てんこ

ブログ名は愛猫(てん)の愛称です。中身は個人のIT系学習記録です。

気象庁の公開データをZabbixでスクレイピングしてみました。

こちらは、Zabbix Advent Calendar 2025 の 12/4分の記事です。
他にもいろいろと面白い投稿があると思います。この時期は毎年楽しみです!

きっかけ

こちらの記事で温湿度計の情報をZabbixで取得したときのことを書きました。

技術的には何番煎じか分からないネタだったのですが、X(Twitter)などで拡散していただき、多くの方にご覧いただけたようです。

ご覧いただきありがとうございます。励みになります。

tenko.hatenablog.jp

これを考えているときに、「実測だけじゃなくて予報と組み合わせると面白そうだな」と思ったのがきっかけです。当初の電力測定はどこへやら。よくあることですね。

そのため、今回のブログの記述箇所は、以下の図の青枠で囲った箇所になります。

今回のブログの対象箇所
ダッシュボード上の対象箇所

なお、今回のアドカレの中でも、SwitchBot周りはリファインしたものをご紹介する予定です。

1.1対応をテンプレ単体で実装する方法を悩み中です。

それでは本編です。

早く使いたい人のためのテンプレート公開

  • テンプレートはこちらです。
  • ホストに紐づけた際、マクロで{$LOCATION_CODE}を定義してください。
    • 東京の場合は「130000」、大阪は「270000」です。
    • 詳細の一覧が見つけられてないのですが、このHPなどが参考になると思います。

気象庁のオープンデータのご紹介

気象庁さんは、各地域で得られたデータなどをオープンデータとして公開されています。

気象データを使ってみませんか|気象データ利用ガイド

今回は、その中で各地域ごとの以下データを取得して、「当日の予想最高気温・最低気温」として活用させていただいています。

URL構造と得られるデータ

解説されているサイトが見つからないのですが、以下のような形でアクセスすると、JSONで各地域の以下データを得られます。

  • アクセス先URL…https://www.jma.go.jp/bosai/forecast/data/forecast/{$LOCATION_CODE}.json
  • 得られる情報
    • 都道府県の代表地域に関する以下の情報
      • 翌日の天気予報
      • 翌日の風向き
      • 当日9時の実測温度
      • 当日24時の実測温度
      • 翌日の予想最高気温
      • 翌日の予想最低気温

今回は、この中から天気予報を除いたデータをアイテムとして取得する構成にしています。

都道府県によって区分される地域数に差があるようです。

Zabbix上で実装の設計

URL構造とテンプレート化

実際のデータは以下のようになっています。

[
    {
        "publishingOffice": "沖縄気象台",
        "reportDatetime": "ここにデータを生成した時間が入る",
        "timeSeries": [
            {
                "timeDefines": [
                  <ここに下の項目内の対象日付が入る>
                ],
                "areas": [
                    {
                        "area": {
                            "name": "本島中南部",
                            "code": "471010"
                        },
                        "weatherCodes": [
                     <ここにtimeDefinesで定義された日付の各データが入る>
                        ],
                        "weathers": [
                     <ここにtimeDefinesで定義された日付の各データが入る>
                        ],
                        "winds": [
                     <ここにtimeDefinesで定義された日付の各データが入る>
                        ],
                        "waves": [
                     <ここにtimeDefinesで定義された日付の各データが入る>
                        ]
                    },
(中略)

そのため、最初にディスカバリとして、 areas.area で宣言された該当都道府県内の各地域の名称とコードを取得します。

保存前処理
LLDマクロ

その後、各コードをIndexとして、tempのデータをアイテムテンプレートで作成しています。

アイテムテンプレート

詳細についてはテンプレートの中身をご確認いただいた方が早いと思いますので、そちらをご参照ください。

ちょっとだけ工夫した点

得られるデータは「翌日の予報」なのですが、私が得たいのは「昨日予報された最高気温と最低気温」が「本日の実測と比較してどうか」という情報です。

そのため、赤枠でかこった箇所のアイテムは、タイムシフトで前日分のデータを得る形にしています。

当日データに変換するための計算アイテム

そのため、以下のMap上の画像上に表示しているラベルアイテムは、タイムシフトした当日の予想最高気温・予想最低気温になっています。時系列を合わせるって大事ですよね。

グラフなどではタイムシフト用のデータを作らなくても表現可能なのですが、Mapのラベルでは難しそうだったので、こういう形にしました。もし認識誤りをしていたり、他にいい実現手段をお持ちの方は教えてください。

■実際のラベルの値(静岡市の例)

予想最高気温:{?last(/{HOST.HOST}/jma.forecast.temp_max.today[50331] )}

予想最低気温:{?last(/{HOST.HOST}/jma.forecast.temp_min.today[50331])}

Map上に当日のデータを表示している箇所

これを見て、予報があたったのか外れたのか、というのを眺めています。

監視取得時間のチューニング

このデータを取得してみて、実は公開時間が24時間ではないことに気が付きました。

実際に取得してみた結果が以下のような結果でした。

予報データの応答があるタイミング

このため、テンプレート内では以下の定義をしています。

  • アイテム取得…1時間ごと。ただし5時から15時の間に限定する。

監視間隔の定義

  • タイムシフトの結果を得る際の計算アイテム…#12として定義(あってるかちょっと不安)

計算アイテムの中身

改めて書いていて思いましたが、以下のような形にして割り切れば、もっとスマートですね。

  • 取得頻度は1日1回にする
  • 当日分を抽出するためのタイムシフトは#1にする

ただ、せっかくモニタリングしてるなら、取れる情報は取れるときに取りたくなるのがサガというものですよね。

※SwitchBotAPIの1日当たりのリクエスト上限増えないかな

終わりに

ということで、気象庁のオープンデータをZabbixで活用する方法をご紹介しました。

この例以外でも、天気予報の文字データなどや風向き、風力の予報などいろいろな形で活用できるデータがあると思います。

皆さんのお好みに合った形で、テンプレートを改造して活用してみてください。