[IoT] BashでNetatmo Weather APIを使って、世界中のリアルタイムな気象データを取得してみる

# Netatmo Weather Stationとは

Netatmoの製品で、室内外に設置する個人向け気象ステーションです。
気温、湿度、CO2、騒音、気圧などを測定することができます。

[Netatmo Weather Station](https://www.netatmo.com/ja-JP/product/weather/weatherstation)

室外モジュールの(共有が許可された)パブリックデータは、Netatmoの提供するパブリックAPI([Netatmo Weather API](https://dev.netatmo.com/resources/technical/reference/weatherapi))を利用して、だれでも取得することができます。

# 環境
OS：Ubuntu 14.04.5 LTS
ライブラリ：GNU bash, version 4.3.11、jq version 1.3

# 準備
Netatmo Weather APIを利用するためには、Client id と Client secretが必要になります。
[Netatmoログイン画面](https://auth.netatmo.com/access/checklogin)からSign-upをしてアカウント生成後、アプリケーションを生成し、Client id、Client secretを取得してください。

# Bashのサンプル
### 認証API
Netatmo Weather APIを利用するには、アクセストークンが必要なため、まずは認証を行いアクセストークンを取得します。
 [Guides Authentication](https://dev.netatmo.com/resources/technical/guides/authentication)

```sh
# 認証情報
USER_NAME={Netatmoアカウントのメールアドレス}
PASSWORD={Netatmoアカウントのパスワード}
CLIENT_ID={NetatmoアプリケーションのClient id}
CLIENT_SECRET={NetatmoアプリケーションのClient secret}

# Endpoint URL
URL_AUTH="https://api.netatmo.net/oauth2/token"

# アクセストークン保存用ファイル
TOKEN_FILE="access_token.json"

# アクセストークンの新規発行
if [ ! -f $TOKEN_FILE  -o ! -s $TOKEN_FILE ]; then
    echo "Get new access token"
    curl -s --data "grant_type=password&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&username=${USER_NAME}&password=${PASSWORD}&scope=read_station" "${URL_AUTH}" > ${TOKEN_FILE}
fi

# アクセストークンの期限が切れていた場合、リフレッシュトークンを利用して、アクセストークンを更新
atoken=`jq -r ".access_token" $TOKEN_FILE`   # アクセストークン
rtoken=`jq -r ".refresh_token" $TOKEN_FILE`  # リフレッシュトークン
expiration=`jq -r ".expires_in" $TOKEN_FILE` # トークンの期限

filedate=`date +%Y-%m-%d_%H:%M:%S -r $TOKEN_FILE`
filedate=${filedate/_/ }
filedate=`date -d "$filedate" +%s`
limittime=`expr $filedate + $expiration`
currenttime=`date +%s`
echo "token expires. limittime=${limittime}, currenttime=${currenttime}"

if [ $limittime -lt $currenttime ]; then
    echo "Refresh access token"
    curl -s --data "grant_type=refresh_token&refresh_token=${rtoken}&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}" "${URL_AUTH}" > $TOKEN_FILE
    atoken=`jq -r ".access_token" $TOKEN_FILE`
fi
```

###  気象データ取得API

アクセストークンが取得できたら、いよいよ[Netatmo Weather API](https://dev.netatmo.com/resources/technical/reference/weatherapi)を使いましょう。
「パブリックデータ取得範囲」を変更すると世界中の気象データを取得することができます。

```sh
# Endpoint URL
URL_GET_PUBLIC_DATA="https://api.netatmo.net/api/getpublicdata"

# パブリックデータ保存用ファイル
DATA_FILE="data.log"

# パブリックデータ取得範囲(緯度経度)　// 東京都心部のデータを取得するよう設定してみた
LAT_NE=35.888282
LON_NE=139.910881
LAT_SW=35.501274
LON_SW=138.942024

# パブリックデータ取得用フィルタ
REQUIRED_DATA=rain
REQUEST_FILTER=true

# パブリックデータ取得
echo "Netatmo Weather API. getpublicdata."
publicdata=`curl -s --data "access_token=${atoken}&lat_ne=${LAT_NE}&lon_ne=${LON_NE}&lat_sw=${LAT_SW}&lon_sw=${LON_SW}&required_data=${REQUIRED_DATA}&filter=${REQUEST_FILTER}" "${URL_GET_PUBLIC_DATA}" | jq -r ".body"`

echo $publicdata | jq -r "." > $DATA_FILE

```
これで、パブリックデータ保存用ファイル(data.log)に、リアルタイムな気象データが保存されるはずです。


# まとめ
Netatmoは公式で、PHP、Objective-C、Windows 8、Java(Android?)等のSDKを提供していますが、
サクッとデータだけを取得したい場合には、Bashで十分ですよね。

個人向けの気象ステーションで取得したデータ(の一部)が、全世界で見れるって何か素敵な気がしました。

ちなみに、Netatmoのサイトでは、パブリックデータをマップで確認できます。
[ウェザーマップ](https://weathermap.netatmo.com/)