rcmdnk's blog

20220619_amedas_200_200

Raspberry Piで室内の温度や湿度を測定していますが、 外の温度も分かると色々うれしいということで 気象庁が出してくれている外気温を取得して同時に表示できるようにしてみました。

気象庁のデータ

昨年気象庁のホームページがリニューアルされて、 記録されたデータや天気予報などがJAON形式で取得できるようになったことが発見されました。

その後、これの仕様として、継続的な提供を約束するものではないが、 規約に準拠して利用する限りは使っても良いものだ、とのお達しが出ました。

政府標準利用規約 - Wikipedia

ということで、これを使いたいと思います。

アメダスのデータ

今回は実際に計測されたアメダスのデータでなるべく最新のものがほしいです。

データは

https://www.jma.go.jp/bosai/amedas/data/map/<YYYYMMDDHH>0000.json

というURLで取れて、1時間毎に新しいデータが作られる様です。 分、秒に関しては今のところ0000しかない模様。

https://www.jma.go.jp/bosai/amedas/data/map/20220101120000.json

とかで過去のデータもとれます。 ただし、この形式で取れるのは10日くらい前までのようです。(上のものはリンク切れ)

これをとってみると

"44132":{"pressure":[1002.4,0],"normalPressure":[1005.2,0],"temp":[29.1,0],"humidity":[73,0],"snow":[null,5],"snow1h":[0,6],"snow6h":[0,6],"snow12h":[0,6],"snow24h":[0,6],"sun10m":[0,0],"sun1h":[0.0,0],"precipitation10m":[0.0,0],"precipitation1h":[0.0,0],"precipitation3h":[0.0,0],"precipitation24h":[0.0,0],"windDirection":[11,0],"wind":[1.2,0]}

みたいなデータの集まりが入ってます。

この最初が場所のIDで、tempとかhumidityとかで気温や湿度が取れます。配列の1つ目が値で二つ目は良くわからず。。。tempとかだと必ず?0。

場所のIDは

https://www.jma.go.jp/bosai/amedas/const/amedastable.json

で見ることができます。

"44132":{"type":"A","elems":"11111111","lat":[35,41.5],"lon":[139,45.0],"alt":25,"kjName":"東京","knName":"トウキョウ","enName":"Tokyo"}

とかで、東京が44132です。

latlonが緯度経度なのでおそらく観測点の場所だと思いますが、東京、大阪などはありますが、基本的には市町村の名前があります。あと成田国際空港とか空港もちらほら。

この中から自分の住んでる場所のIDを見つけて、アメダスのデータからそのIDEAの情報を抜き出します。

1時間おきに新しい情報が提供されますが、12時のデータは12時ちょうどに出るわけではなく、大体10分~20分くらいたったあとに提供されてます。 また、ファイルができた最初の段階では1つの観測点データだけが入ったようなデータになってることもあり、しばらく経ってから取得する必要があります。

Pythonで取得する

amedastableで取得できるエリアコードの中身に 名前のタイプとして、

  • kjName: 漢字(e.g. 東京)
  • knName: カナ(e.g. トウキョウ)
  • enName: ローマ字(e.g. Tokyo)

の3種類があるので好きなものを使って取得できます。

あとはこのコードを使って

amedas.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python3
import sys
import requests
from datetime import datetime, timedelta


def get_code(name, name_type='enName'):
    area = requests.get("https://www.jma.go.jp/bosai/amedas/const/amedastable.json").json()
    for code in area:
        if area[code][name_type] == name:
            return code

    return None


def get_json(datetime_str):
    return requests.get(f"https://www.jma.go.jp/bosai/amedas/data/map/{datetime_str}.json").json()


def get_data(code, datetime_str=None):
    if not datetime_str:
        datetime_str = datetime.now().strftime('%Y%m%d%H0000')
        try:
            data = get_json(datetime_str)[code]
        except Exception:
            # try to get previous data
            datetime_str = (datetime.now() - timedelta(hours=1)).strftime('%Y%m%d%H0000')
            data = get_json(datetime_str)[code]
    else:
        data = get_json(datetime_str)[code]
    return data


def main():
    code = '44132'
    name_type = 'enName'
    datetime_str = None
    if len(sys.argv) > 1:
        code = sys.argv[1]
        if len(sys.argv) > 2:
            name_type = sys.argv[2]
            if len(sys.argv) > 3:
                datetime_str = sys.argv[3]
    if not code.isdigit():
        code = get_code(code, name_type)
    data = get_data(code, datetime_str)
    print(f"気温: {data['temp'][0]}℃, 湿度: {data['humidity'][0]}%)


if __name__ == '__main__':
    main()

みたいな感じでとってあげれば

$ amedas.py
気温: 25.3℃, 湿度: 72%
$ amedas.py Naha
気温: 31.2℃, 湿度: 92%
$ amedas.py Sapporo
気温: 24.1℃, 湿度:5792%
$ amedas.py 那覇 kjName
気温: 31.2℃, 湿度: 92%
$ amedas.py Tokyo enName 20220615010000
気温: 15.2℃,湿度: 95%

といった感じで各地の気温、湿度が取得できます。

3番目の引数で時間を指定してますが、指定がないときは現在時刻、 ただし、上にも書いたように、時間が更新された直後だと取れない場合もあるのでその場合は1時間前の情報をとってくるようにしています。

あとはこれを適宣必要な情報取れるようにしてRaspberry Pi上で適時動かすだけ。

Raspberry Pi上での運用

こんなスクリプトを用意して

raspi_setup/amedas

/opt/bin/以下に設置。

別途

/etc/conf.d/amedas.conf
1
2
code=44132
log=/opt/var/amedas

といった感じのファイルを用意。

これを systemdで実行します。

raspi_setup/amedas.service at main · rcmdnk/raspi_setup

raspi_setup/amedas.timer at main · rcmdnk/raspi_setup

amedas.service, amedas.timer/etc/systemd/system/の下に設置。

その後、

$ sudo systemctl enable amedas.timer

とすれば、5分おきにデータを取得して/opt/var/amedasに書き出してくれます。

これを別途、1分おきに見に行ってLCDに表示するものを動かしておけばLCD上に表示してくれるようになります。

20220619_amedas.jpg

Outの部分がamedasからとったもの。

Sponsored Links
Sponsored Links

« Raspberry Piで液晶ディスプレイを使って温度とかを表示する LinkcheckerをGitHub Actionsで動かせるようにした »