以前、Google Apps Scriptにて環境測定IoTである「Netatmo」の観測データを取得するツールを作成しました。Web APIとGASの相性は非常に良いのですが、G Suiteが使えないと利用ができません。そうなると結局は、VBAに頼るのが常。ということで、VBAにてNetatmo APIにアクセスしてデータを取得するツールを作りました。
ただし、取得の時間軸スケールが「max」の場合と、「30min」などの場合とで、返ってくるJSONデータに構造上の違いがあり、今回は30minなどの時間指定版です。また、今回は複数親機、複数子機対応にしています。そうなると、Netatmo APIのRate Limitに引っかかることになるので、実際の運用ではこの辺の注意が必要になります。
目次
今回使用するファイル
- netatmogetter - xlsmファイルですので初回実行時にマクロの有効化が必要です。
- VBA-JSON - VBAでJSONデータを扱うのに利用する強力なライブラリ
セットアップ
このアプリでは事前にセットアップが必要です。以下の手順にしたがってクライアントIDとシークレット、リダイレクトURLを設定してください。事前にNetatmo自体のセットアップとサービスへのリンクは済ませておいてください。
OAuth認証実行用情報のセットアップ
このリダイレクトURLですが、認証が完了したら移動する先のURLで、そのURLに認証用のコードがつく形になっています。これをプログラムが取得してAccess Tokenを取得します。そのため、このリダイレクトURLは知らないサイトなどに設定してしまうと、そのサイトのアクセスログに記録が残ってしまい、認証用コードも残ってしまうので、必ず自分の所有のサイト等にしましょう。
コードの登録
クライアントID、クライアントシークレット、そしてリダイレクトURL。この3つの外に企業内で使う場合、ケースによってはプロキシーサーバのアドレス登録も必要になります。
API関係の設定
- 起動したらNetatmoタブ内にある「認証用データの登録」をクリック
- 出てきたダイアログのAPI Keyに「クライアントID」を入力する
- 同じくダイアログのAPI Tokenに「クライアントシークレット」を入力する
- 登録ボタンを押す事でレジストリにこれらのコードが登録されます。
図:API関係のセットアップは必須です。
リダイレクトURLの設定
こちらの入力も必須です。認証後にAuthcodeを取得するにはリダイレクト先のURLに続けてコードが付与されるので、リダイレクト先がないとAccess Tokenの発行にたどり着けません。
- 開発タブからVisual Basicを開きます。
- 標準モジュールのnetatmoを開きます。
- Public Const netaredirect As Stringの変数にリダイレクト先URLを入力します
プロキシーサーバアドレスの設定
また、社内利用でプロキシーサーバを経由する必要がある場合には、以下の手順でコード内にプロキシーサーバまでのURLを入力する必要があります。プロキシーを利用していない場合には不要です。
- 開発タブからVisual Basicを開きます。
- 標準モジュールのnetatmoを開きます。
- Const proxyuri As Stringの定数にプロキシーサーバアドレスを入力する(ポート番号まで入力)
- いくつかのFunction内で、.setProxyの行がコメントアウトされているので、コメントアウトを解除する
時間軸スケールの設定
今回のアプリでは取得する時間軸スケールは1時間単位(1hour)が設定されています。maxにすると取得できる最も細かい時間軸で取得が可能ですが、Netatmo APIのRate Limitに引っかかって、取得ができなくなることがあります。今回は3台の親機と9台の子機だったので、1hourで1回で大体300件ほどのデータ(1回あたりのリクエストで最大500件までなので)、これが限界です。
この設定を変えたい場合には、以下の手順で変数の値を書き換えてください(30minなどに)
- 開発タブからVisual Basicを開きます。
- 標準モジュールのnetatmoを開きます。
- Const timescale As String = "1hour"の変数の1hourを書き換える
認証の実行
API Key等をセットしただけでは、Netatmoからデータを取得できません。これからこれらをもとに「Access Token」を取得します。以下の手順で取得しておきます。
- アプリを起動して、Netatmoタブ内にある「アクセス認証の実行」をクリック
- IEが起動し、アカウント名とパスワードを入力して普通にログインします。
- 一瞬リダイレクト先に転送されて、すぐにIEが閉じます。
- 取得されたAuthcodeでAccess Token他が取得されて、レジストリに登録されます。
- 失効時にはRefresh Tokenを元に自動でAccess Tokenを再取得するようになっていますので、再ログインは不要です。
図:アクセス認証画面
使い方
事前準備が完了したらあとは非常に簡単です。
デバイスリストの取得
- 起動したらNetatmoタブ内にある「デバイスリスト取得」をクリック
- Netatmoでセットアップ済みで対象のアカウントにリンクされてるデバイスデータがダウンロードされます。
- devicelistシートには、デバイスID, デバイス名、取得できるデータタイプの他に、複数親機が登録されている場合にはそれをグループとして、グループ番号(連番)と親機かどうかのフラグを付けるようにしています。
デバイスリストを取得しておかないと、観測データの取得ができないので、予め取得しておきましょう。また、登録されているデバイスが足らない場合、そのアカウントでのアクセス権限が付与されていないことが考えられるので、Netatmoのサイト上からアクセス権限を付与してあげましょう。
- https://my.netatmo.com/app/stationにアクセスする
- 右上の親機を選択する
- マイステーションの管理をクリックする
- 出てきたダイアログの下のほうにある「ステーションゲスト」にある「eメールで招待」をクリック
- メーラーが立ち上がるので、招待したい人に対象のメールを送ってあげる。
- 相手がメールの内容に従って登録を済ませると、アクセスが可能になります。
観測データの取得
デバイスリストを取得できたら、あとは観測データを取得するだけ。デフォルトでは1hourで設定されているので、通常は1台につき最大24件のデータが取得可能です(日を1日しか指定できないようにしてある為)。
- 起動したらNetatmoタブ内にある「観測データ取得」をクリック
- 「はい」をクリックすると既存のデータをクリアしてデータを取得開始します。
- 取得する対象の日の日付を「yyyy/mm/dd」の形式で指定してあげます。
- 日付が当日の場合その時間までに取得されたデータがダウンロードされ、前日以前の場合は1デバイス当たり24件のデータがダウンロードされます。
- 1リクエスト当たり10秒の間隔を空けないと、Rate Limitに引っかかる為、コード内でデバイスごとに10秒間のウェイトが入っています。たくさん機器がある場合、取得まで相応の時間が掛かります。
- デバイス名、観測時間、温度、CO2、湿度、騒音、気圧、デバイスIDが取得され、またグループのIDも付け加えたリストが完成します。
- あとはこのデータを元に資料等を作るだけ。
注意事項
今回のアプリ自体は、64bit Excel2016で動くように作ってあります。しかし、Access Tokenを取得するコードの部分で、64bit版Windows10などのIE 64bitの仕様でここでエラーになる可能性があります(これはこの手の認証系全てで言える事です)。そのため、以下の手順で拡張保護モードの解除をし、IEを32bitモードで起動するようにしておく必要があります。