[zabbix][外部チェック] WorldWeatherOnlineから天気データを取得してZabbixに格納する。

zabbix
World Weather Online
The latest weather forecasts for the UK and worldwide. Offering weather forecasts up to 14 days in advance, hourly forec...

先日OpenWeatherMapから天気情報を取得する方法を書きましたが、この手の天気情報を取得できるサイトとしてWorldWeatherOnlineというところがあります。

iOSやAndroidアプリなんかではよく利用されるところなのですが、こちらから天気情報を取得する方法を書いておこうかと思います。

環境:

  • CentOS 6.6
  • Zabbix 2.4.4

WorldWeatherOnlineにて、情報を取得するためにはユーザー登録が必要です。無料でも利用できますが、APIについては毎秒5回まで、1日1,000回までに制限されています。また、予報については3時間毎までしか取得できないので、それ以上必要になるようであれば、有料アカウントにする必要があります。

/
https://developer.worldweatheronline.com/auth/register

2019年8月11日:追記

気が付いたら無料では使用できなくなったようです。とりあえず最初の登録から60日間は無料で使用できるようですが。

Weather API Pricing | World Weather Online
World Weather Online API pricing is simple, easy and low cost which allows developers and businesses to access weather d...

APIで取得できる情報については詳細が以下にあります。

Premium Weather API | World Weather Online
Fast and easy to use Premium Weather API for worldwide realtime, future and historical weather forecast covering land, s...

APIでザラッと取得できる情報は以下の様な感じです。

{
  "data": {
  	"current_condition": [
  {
    "cloudcover": "0",
    "FeelsLikeC": "6",
    "FeelsLikeF": "43",
    "humidity": "81",
    "lang_ja": [
    {
      "value": "もや"
    }
    ],
    "observation_time": "12:17 PM",
    "precipMM": "0.0",
    "pressure": "1028",
    "temp_C": "6",
    "temp_F": "43",
    "visibility": "5",
    "weatherCode": "143",
    "weatherDesc": [
    {
    "value": "Haze"
    }
    ],
 	"weatherIconUrl": [
    {
    	"value": "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0006_mist.png"
    }
    ],
    "winddir16Point": "NNE",
    "winddirDegree": "22",
    "windspeedKmph": "0",
    "windspeedMiles": "0"
    }
    ],
    "request": [
    {
      "query": "London, United Kingdom",
      "type": "City"
    }
    ],
    "weather": [
      {
  	"astronomy": [
    {
      "moonrise": "05:59 AM",
      "moonset": "06:38 PM",
      "sunrise": "06:04 AM",
      "sunset": "06:13 PM"
    }
    ],
    "date": "2015-03-20",
    "hourly": [
    {
    "chanceoffog": "0",
    "chanceoffrost": "0",
    "chanceofhightemp": "0",
    "chanceofovercast": "0",
    "chanceofrain": "0",
    "chanceofremdry": "0",
    "chanceofsnow": "0",
    "chanceofsunshine": "53",
    "chanceofthunder": "0",
    "chanceofwindy": "0",
    "cloudcover": "47",
    "DewPointC": "3",
    "DewPointF": "37",
    "FeelsLikeC": "-1",
    "FeelsLikeF": "31",
    "HeatIndexC": "3",
    "HeatIndexF": "38",
    "humidity": "96",
    "lang_ja": [
    {
    	"value": "所により曇り"
    }
    ],
    "precipMM": "0.0",
    "pressure": "1031",
    "tempC": "3",
    "tempF": "38",
    "time": "0",
    "visibility": "10",
    "weatherCode": "116",
    "weatherDesc": [
    {
	    "value": "Partly Cloudy"
    }
    ],
    "weatherIconUrl": [
      {
      	"value": "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0004_black_low_cloud.png"
      }
    ],
    "WindChillC": "-1",
    "WindChillF": "31",
    "winddir16Point": "NNE",
    "winddirDegree": "26",
    "WindGustKmph": "27",
    "WindGustMiles": "17",
    "windspeedKmph": "15",
    "windspeedMiles": "9"
    },
    ],
      "maxtempC": "15",
      "maxtempF": "59",
      "mintempC": "5",
      "mintempF": "40",
      "uvIndex": "3"
      }
    ]
  }
}

とても多いです。

いくつかの取得部に分かれていますが、「current_condition」、「weather」、「astronomy」、「hourly」があるよーというのを抑えておけばよいかと。

  • current_conditionが現在の天気なので、基本的にはこの部分しか気にしないのではないかと思います。
  • weatherには、一日の最高気温、最低気温、UV指数もあったりして季節に依っては便利かもしれません。
  • astrnomyは、日の出日の入り、月の出月の入りの時刻が出力されます。
  • hourlyは(基本)3時間毎天気情報になります。パラメータの指定により6時間や12時間なども選ぶことができます。

今回もシェルスクリプトを用意しました。

先に言うと、WorldWeatherOnlineは日本語化された情報を返してくれるので、以前のOpenWeatherMapのようにあれこれ変換する必要はないのがありがたいです。
また華氏と摂氏を同時に取得できるのでこちらについても変換等は必要ありません。

APIKEY=""
URL="https://api.worldweatheronline.com/free/v2/weather.ashx?"
CURLOPTS="-s"
CITY=$1
WEATHER=$2
APIOPTS="&format=json&showlocaltime=yes&lang=ja&num_of_days=1&date=today&tp=1"
DATA=""
case $WEATHER in
"weather")
# Weather condition description
DATA=`curl ${CURLOPTS} "${URL}q=${CITY}${APIOPTS}&key=${APIKEY}" | 
jq -r ".data.current_condition[].lang_ja[].value"`
echo $DATA
;;

相変わらず必要部分をjqのフィルタリングで取得するようにしています。
OWMと比較しても随分とシンプルに出来ると思います。

"winddir16Point")
  # Wind direction in 16-point compass
  DATA=`curl ${CURLOPTS} "${URL}q=${CITY}${APIOPTS}&key=${APIKEY}" | 
  jq -r ".data.current_condition[].winddir16Point"`
  echo $DATA
  ;;

風向きについても英字ながら16方位で情報を取得できるので、特に変換等は必要ないかと。どうしても日本語化されていないと辛いという方は、Caseなどで日本語に割り振ったりするのがいいかもしれませんね。

"windspeedKmph")
  # Wind speed in kilometres per hour trans m/s
  DATA=`curl ${CURLOPTS} "${URL}q=${CITY}${APIOPTS}&key=${APIKEY}" | 
  jq -r ".data.current_condition[].windspeedKmph"`
  echo "scale=1; ${DATA}/3.6" | bc
  ;;

風速はkm/hというあまり日本では馴染みのない単位になるので、私はm/sに変換しなおしています。

これぐらいでしょうか。
気圧がミリバールだったりするので、hPaとは厳密には違うはずですが、まあ私はとりあえずそのまま取得するようにしています。

スクリプトは以下にとりあえず置いてあります。

zabbix_template/weather_check at master · kometchtech/zabbix_template
zabbix template. Contribute to kometchtech/zabbix_template development by creating an account on GitHub.

なお、APIについてはWebサイトにAPI ExplororとしてGUIから情報を確認することができるので、そちらを確認しながら設定するのが良いと思います。

あとは、OpenWeatherMapのときと同様、Zabbix側では外部チェックとしてシェルスクリプトを実行するようにします。

第1引数は場所、第2引数は取得したい天気情報、になります。

Snip20150320_1.png

WorldWeatherOnlineは、OpenWeatherMapとは違いサクッとAPIを返してくれます。

この辺りはボランティアベースのOpenWeatherMapとは違うようです。

週間予報なども取得できるので、アプリやWebサイトに掲載するなどのときには便利だと思います。

また個人的Tipsとなりますが、取得したい都市について、街名で与えるよりも座標情報で与えたほうが、取得したい場所の天気情報の確度が高まると思います。

不明な点や、もっとこうしたほうがいいよ、などありましたらご指摘ください。

この記事を書いた人

kometchtech

うつ病を患いながら、IT業界の末席にいるおっさんエンジニア。科学計算をしたことがないのに、HPC分野にお邪魔している。興味のある分野で学習したことをblogにまとめつつ、うつ病の経過症状のメモも置いておく日々。じつはRouterboard User Group JPの中の人でもある。 Amazon欲しいものリスト / Arm板を恵んでくれる人募集中

kometchtechをフォローする
タイトルとURLをコピーしました