[zabbix][外部チェック] OpenWeatherMapから天気データを取得してZabbixと連携する方法。

2015/03/17 10:17zabbixOpenWeatherMap,zabbix,外部チェック,天気予報

天気情報を蓄積しておきたいなぁと思っていたところ、天気情報をAPIで提供しているサービスがあったので、それを利用してZabbixと連携する方法をまとめてみました。

といっても何番煎じなのか分かりませんが。

確認環境:

  • CentOS 6.6
  • Zabbix 2.4.4

OpenWeatherMap

こちら、APIの形で色々とデータを提供されているのでそちらを利用します。

実際にAPIで問い合わせる

詳細はAPIのページを参照していただくと良いのですが、以下の様な感じでデータを取得できます。

curl "http://api.openweathermap.org/data/2.5/weather?q=tokyo,jp&units=metric" | jq .
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
120   480    0   480    0     0   2789      0 --:--:-- --:--:-- --:--:--  4897
{
  "cod": 200,
  "name": "Tokyo",
  "id": 1850147,
  "dt": 1426548821,
  "coord": {
  "lat": 35.69,
  "lon": 139.69
},
"sys": {
  "sunset": 1426495751,
  "sunrise": 1426452638,
  "country": "JP",
  "message": 0.0071
},
  "weather": [
    {
    "icon": "10n",
    "description": "light rain",
    "main": "Rain",
    "id": 500
    }
  ],
  "base": "cmc stations",
  "main": {
    "humidity": 100,
    "grnd_level": 1027.48,
    "sea_level": 1032.29,
    "pressure": 1027.48,
    "temp_max": 10.799,
    "temp_min": 10.799,
    "temp": 10.799
  },
  "wind": {
    "deg": 344.506,
    "speed": 6.41
  },
  "clouds": {
    "all": 92
  },
  "rain": {
    "3h": 0.82
  }
}
POINT

q= で町の名前を指定units=metricで気温を摂氏(℃)で取得できるようになります。未指定だとケルビンでの取得となります。華氏の場合はimperialになります。

なおデータを整形するためにJSONパーサのjqを導入しています。未導入の方は導入するようにしてください。

POINT

CentOSの場合は

yum install jq

Zabbixに設定していく

で、この後は、整形したデータをZabbixに導入するだけです。
本当はPythonなどを使用するべきなのでしょうが、自分にはその力がないので強引にシェルスクリプトでスクリプトを作成してみました。

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

zabbix_weather_check/check_weather.sh at master · kometchtech/zabbix_weather_check /
https://github.com/kometchtech/zabbix_weather_check/blob/master/check_weather.sh

天気情報取得部、天気日本語化部、風向き日本語化部に分かれています。

#!/bin/bash

# http://openweathermap.org/current
CITY=$1
WEATHER=$2
CURLURL="http://api.openweathermap.org/data/2.5/weather?q="
CURLOPTS="-m 30 --retry 10 -s"
APIKEY=""
DATA=""

case $WEATHER in
"weather")
  while [ "$DATA" = "" -o "$DATA" = "failed to connect " ]
  do
      DATA=`curl ${CURLOPTS} "${CURLURL}${CITY}&APPID=${APIKEY}"&units=metric`
  done
  weatherCode `echo ${DATA} | jq .weather[0].id`
  ;;

とりあえずAPIの取得の際にエラーが出る時があるので、なんとなくのエラー処理をいれています(これでいいのか分かりませんが)。また、個々のデータを取得するためにjqのフィルタリング機能を利用してデータを指定するようにしています。

function weatherCode() {
case $1 in
# Thunderstorm
200)
  echo "小雨と雷雨"
  ;;
201)
  echo "雨と雷雨"
  ;;
202)
  echo "大雨と雷雨"

天気部分については、天気IDを取得できるので、それを判定して日本語情報を返すようにしています。こちらは参考先をパクリリスペクトしています。

function windDegree() {
degree=$1
degree=`echo $degree * 10000 | bc` > /dev/null 2>&1
degree=${degree%.*}
if [ ${degree} -gt "2250000" ]; then
	degree=`expr ${degree} + 3600000`
fi

if [ 225000 -lt $degree -a $degree -le 675000 ]; then
	echo "北東"
elif [ 675000 -lt $degree -a $degree -le 1125000 ]; then

風向きも同じです。Degreeとか知らんかったです(数学忘れた・・・)

あとは、Zabbixサーバの外部スクリプトを読み出す場所にスクリプトを配置します。
そして、アイテムとしてスクリプトを指定します。

Snip20150317_1.png

あとはデータが取得できるかどうかを確認します。

Snip20150317_2.png
なお

普通に使う分には問題にならないと思いますが、APIについては1分間あたり3000回までに制限されているようです(無料プランの場合)。アプリなどを使用してそれ以上になる場合は、APIキーの取得と合わせて有料プランを選択する必要があるそうです。

Weather API Price-list /
http://openweathermap.org/price

データを1年ぐらい取得しておけば、1年こんなことがあったなぁと思いだせたりすることもあると思うので、色々と活用してみると面白いかもしれません。

参考:

この記事を書いた人
kometchtech

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

Buy Me A Coffee