Netatmoの値をMRTGで表示してみる

Netatmoのデータ(温度・湿度)をMRTGでグラフ化してみます。

必要な物

  • MRTGな環境(手元にサーバがない場合は、AWSやGCPの無償枠でw)
  • curlとjq
  • Netatmo Weather Station(←Amazonへのリンク)
  • Netatmoのアカウント

Client idとClient secretの取得

※取得済みの場合はこの手順はパスして結構です。

  1. まずはNetatmo公式にログインします
    https://auth.netatmo.com/en-us/access/login
  2. 次にNetatmo Connectに移動します
    https://dev.netatmo.com/myaccount/createanapp
  3. CREATE AN APPをクリックします
  4. NameにはNetatmoのログイン用メアドを入力します
  5. Descriptionには適当な説明を入力します
  6. Data Protection Officer nameには自分の名前を入力します
  7. Data Protection Officer emailにはNetatmoのログイン用メアドを入力します
  8. I accept Netatmo APIs Terms and Conditionsにチェックを入れて、SAVEをクリックします
  9. Client idClient secretが表示されるので、記録します

データ取得用スクリプトの作成

適当な場所に適当な名前で次の内容のスクリプトを置きます。

#!/bin/sh
export LANG=C
temp=/tmp/netatmo.$$
export LANG=C
token=`curl -X POST https://api.netatmo.com/oauth2/token -d "grant_type=password&client_id=[前項で取得したClient id]&client_secret=[前項で取得したClient secret]&username=[Netatmoログインメアド]&password=[Netatmoログインパスワード]" | jq -r '.access_token'`
curl -X GET "https://api.netatmo.com/api/getstationsdata?access_token=$token" | jq '.body.devices[0].modules[0].dashboard_data | .Temperature, .Humidity' > $temp
ibytes=`head -1 $temp | awk '{print $1*10}'`
obytes=`tail -1 $temp | awk '{print $1*10}'`
echo $ibytes
echo $obytes
echo 0
echo "Temp/Hum monitoring"
rm -f $temp
exit 0
  • 小数点1位なデータをMRTGで表示するため、値を10倍して取得しています
  • アクセストークンの有効期限は3時間です
    このため、この例では毎回取得しています
  • jqの出力からダブルクォーテーションマークを外すときは、-rオプションを付けます(上記スクリプト5行目)
  • jqで同時に複数の値を抽出するときは、親キーの後にパイプ文字を入れて、子キーをカンマで並べます(上記スクリプト6行目)

取得できるデータ

室内用デバイスについて
jqのパラメータ 内容
.body.devices[n-1] n番目のデバイス
一つしかない場合は0を指定
.body.devices[n-1].dashboard_data.Temperature 気温(℃)
.body.devices[n-1].dashboard_data.Humidity 湿度(%)
.body.devices[n-1].dashboard_data.CO2 CO2濃度(ppm)
.body.devices[n-1].dashboard_data.Noise 騒音(dB)
.body.devices[n-1].dashboard_data.Pressure 気圧(mb)

外部モジュールについて
jqのパラメータ 内容
.body.devices[n-1].modules[m-1] n番目のデバイスのm番目の外部モジュール
一つしかない場合はそれぞれ0を指定
.body.devices[n-1].modules[m-1].dashboard_data.Temperature 気温(℃)
.body.devices[n-1].modules[m-1].dashboard_data.Humidity 湿度(%)

mrtg.cfgの設定例

mrtg.cfgに次の内容を追加します。
先程のスクリプトは/root/netatmo.shという名前で保存しているものとします。
先程10倍で値を取得しているため、表示するときに0.1を掛けています。

Target[test_temp]: `/bin/sh /root/netatmo.sh`
MaxBytes[test_temp]: 1000
Options[test_temp]: growright,gauge,nopercent,noinfo,noo
Title[test_temp]: 某所の気温
ShortLegend[test_temp]: ℃
YLegend[test_temp]: Celsius
YTicsFactor[test_temp]: 0.1
Factor[test_temp]: 0.1
LegendI[test_temp]: 温度
LegendO[test_temp]:
PageTop[test_temp]: <h1>某所の気温</h1>

Target[test_hum]: `/bin/sh /root/netatmo.sh`
MaxBytes[test_hum]: 1000
Options[test_hum]: growright,gauge,nopercent,noinfo,noi
Title[test_hum]: 某所の湿度
ShortLegend[test_hum]: %
YLegend[test_hum]: %
YTicsFactor[test_hum]: 0.1
Factor[test_hum]: 0.1
LegendI[test_hum]:
LegendO[test_hum]: 湿度
PageTop[test_hum]: <h1>某所の湿度</h1>

出来上がりはこんな感じになります。