| tags:logging categories:server

天候情報を取得

Open Weather Map

制約が少しありますが個人的な仕様であれば、ほぼ無料で使うことのできるAPIが https://openweathermap.org より提供されています。 行きたい国々の天気をチェック、旅情にあふれます。

最近の流行っている、Grafanaを使ってグラフ化をしたいと思います。

APIキーの取得

APIの使い方はマニュアルに書いてある通りで、まずは無料登録を行ってAPIキーを取得します。 こちらのサイト https://openweathermap.org/api にアクセスして、「Current weather data」の「Subscribe」ボタンを押します。 一番左の「Free」から、「Get API key and Start」ボタンを押します。 すると、使い方などが表示されるので説明に沿って進めればOKです。

Freeライセンスは、1分間に60回までしか使ってはいけない(超えると制限される)ので、 使用回数には注意してください。

天候の取得

APIキーが取得できたら天候を取得してみます。

APIには天候を取得したい地域の「地名」もしくは「ID」を指定する事ができますが、推奨されているID指定で進めます。

天候を取得したい地域のIDを調べたいので、Webブラウザで検索してみます。

東京の場合はURLにこのように表示されると思います。 https://openweathermap.org/city/1850147

Open WEather Map TOKYO

末尾の1850147が都市名を示すIDです。

http://api.openweathermap.org/data/2.5/weather?id={CityID}&units=metric&APPID={APIKey}

APIをアクセスをすると下のようなJSON形式のファイルが帰ってきます。 ほぼ必要なデーターは網羅してると思います。

{
  "coord": {
    "lon": -155.67,
    "lat": 20.02
  },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "clear sky",
      "icon": "01n"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 19.29,
    "pressure": 1015,
    "humidity": 69,
    "temp_min": 8.89,
    "temp_max": 25
  },
  "visibility": 16093,
  "wind": {
    "speed": 2.6,
    "deg": 110
  },
  "clouds": {
    "all": 1
  },
  "dt": 1565878322,
  "sys": {
    "type": 1,
    "id": 7872,
    "message": 0.0088,
    "country": "US",
    "sunrise": 1565884966,
    "sunset": 1565931108
  },
  "timezone": -36000,
  "id": 5854571,
  "name": "Waimea",
  "cod": 200
}
※{APIKey}は自分のAPIキーに、{CityID}は都市名を示すID(東京は”1850147″)に置き換えてください。

ファイルをローカルにダウンロードします。

curl -o /PATH/OUT_PUT_FILE.json "https://api.openweathermap.org/data/2.5/weather?id=$CityID&units=metric&appid=$APPID"

JSONファイルをInfluxdbへ登録 by shell

JSON形式のデータをbashで簡単に扱うためにjqを入れます。 (参考:https://qiita.com/asukiaaa/items/a9413b2cc60c598c3d61)

pi@raspberry:~ $ sudo apt install jq

取得したJSONファイルを引数に与えるとデータベースに登録するスクリプトを作成します。 実行は sh weather_update.sh /PATH/OUT_PUT_FILE.json で行います。

#!/bin/bash
#
# weather_update.sh
#

DBNAME="INFLUXDB_NAME" #事前に作成する必要はないです。ユーザー・パスワード設定なし。

# JSONファイルを読み込む
JSON=`cat $1`

# 各要素を変数に代入
dt=$(echo ${JSON} | jq ".dt")
city=$(echo ${JSON} | jq ".name" | sed "s/\"//g")

temp=$(echo ${JSON} | jq ".main" | jq ".temp")
temp_min=$(echo ${JSON} | jq ".main" | jq ".temp_min")
temp_max=$(echo ${JSON} | jq ".main" | jq ".temp_max")
pres=$(echo ${JSON} | jq ".main" | jq ".pressure")
humi=$(echo ${JSON} | jq ".main" | jq ".humidity")

## データベースに書き込む
curl -i -XPOST "http://localhost:8086/write?db=${DBNAME}&precision=s" \
--data-binary \
"weather,city=${city} \
temp=${temp},temp_min=${temp_min},temp_max=${temp_max},pressure=${pres},humidity=${humi} \
${dt}"

あとは、場所によって更新間隔がまちまちですが、 cronに登録して定期的にデータの取得&データベースの登録を実行すればOK!

しばらくしてデータが貯まってきたら、「ダッシュボードの作成」の所と同じ手順でパネルに登録すれば完了です。

※ 上記のスクリプトは`city`の所でエラーが出るかもしれません、、現在スクリプトをパイソンに書き換え中。

おまけ:不快指数の追加

快適度は気温だけでは掴みづらいので、日本ではおなじみ?の不快指数を計算します。 65~75くらいが数値上快適になります。Tシャツ短パン快適生活は70位からかな、、

不快指数とは夏の蒸し暑さを数量的に表した指数で、温熱指標の一つ。 不快指数が75を越えると人口の一割が不快になり、80を越えると全員が不快になると言われている。また、日本人の場合、不快指数が77になると不快に感じる人が出はじめ、85になると93%の人が暑さによる不快を感じると言われている。

from https://ja.wikipedia.org/wiki/不快指数

シェルで小数点計算を入れるためbcをインストールします。

pi@raspberry:~ $ sudo apt install bc

不快指数の数式は幾つかあるようですが、 日本で使われているもので計算します。 以下の計算結果をデーターベース登録時に追加します

dii=$(echo "scale=4; 0.81 * $temp + 0.01 * $humi * (0.99 * $temp - 14.3) + 46.3" | bc)

さて、現在滞在先はしとしと雨が降るグリーンシーズン(新しい雨季の別名、とても良いネーミングだと思う。)で、 日本の梅雨ほどではないけど、ちょっと不快。。 指数的には、80くらいです。春先に行った酷暑インドでは、85オーバーでまさに修行でした。 実家のある東京は85とかで、やはり、、不快指数はトップです。

データーが溜まっていくとちょっと面白いですねぇ。 滞在先のネット環境が途切れ途切れですが、、雲量などを追加してこんな感じ、

Grafana with OpenWeatherMap

これで、だいたい天気がつかめるかな。(どこいこかなぁ。。)

引き続き作業中、次回はビットコインの所得・グラフ化、行ってみよー。

See Also

comments powered by Disqus