制約が少しありますが個人的な仕様であれば、ほぼ無料で使うことのできる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
末尾の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
}
ファイルをローカルにダウンロードします。
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!
しばらくしてデータが貯まってきたら、「ダッシュボードの作成」の所と同じ手順でパネルに登録すれば完了です。
おまけ:不快指数の追加
快適度は気温だけでは掴みづらいので、日本ではおなじみ?の不快指数を計算します。 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とかで、やはり、、不快指数はトップです。
データーが溜まっていくとちょっと面白いですねぇ。 滞在先のネット環境が途切れ途切れですが、、雲量などを追加してこんな感じ、
これで、だいたい天気がつかめるかな。(どこいこかなぁ。。)
引き続き作業中、次回はビットコインの所得・グラフ化、行ってみよー。