頭脳労働する職場環境では、夏は暑さ、冬は寒さといった具合にそのパフォーマンスに大きな影響を及ぼす外的要因がゴロゴロしています。そういった外的要因、感覚ではなく、数値化・視覚化すると何をどう改善すべきか見えてきます。また、この中でとりわけ二酸化炭素濃度については、法令でも1000ppm以下と定められており、これを超えてくると、眠気や思考能力の低下を招きます。

温度、湿度、気圧、騒音、二酸化炭素濃度を計測できるのが今回使用するNetatmoと呼ばれる装置。親機1機に最大4機(室外、室内含む)の子機をぶら下げる事が出来、データはクラウドに蓄積。アプリでいつでもどこでも確認でき、APIでデータを呼び出す事も出来ます。今回このデータを呼出しスプレッドシートに書き込むまでを行ってみたいと思います。

※ちなみにNetatmoは1セットになっていますが、同梱されているのは室外用の子機なので、室内用の子機は別途購入が必要。最大3機まで接続可能です。

※さらにNetatmoには、雨量計、風速計、海外ではサーモスタット、カメラ、スモークアラーム、ドアセンサーなど様々なオプションも売られています。

今回使用する資料・ファイル

事前準備

ライブラリの追加

以下の手順でOAuth2 for Apps Scriptライブラリを追加しましょう。

  1. スクリプトエディタを開きます。
  2. メニューより「リソース」⇒「ライブラリ」を開きます。
  3. ライブラリを追加欄に「1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF」を追加します。
  4. 現時点ではバージョンは30が最新ですので、それを選択しておきます。
  5. 保存ボタンを押して完了

これで、OAuth2.0認証にまつわる様々な関数を手軽に利用できるようになります。

図:OAuth2ライブラリを追加している様子

リダイレクトURLを取得する

リダイレクトURLとは、認証を完了しAccess Tokenを取得したら戻るべきURLを指定するものです。これは、スクリプトIDをもとに作られているので、スクリプトIDを取得して組み立てます。

  1. スクリプトエディタのメニューより「ファイル」⇒「プロジェクトのプロパティ」を開く
  2. 情報の中にある「スクリプトID」を控えておく。
  3. https://script.google.com/macros/d/スクリプトID/usercallback として組み立てる。これがコールバックURLとなる。

図:スクリプトIDはファイル毎に異なるのです。

OAuth認証実行用情報のセットアップ

ここでの準備は、Netatmo自身のセットアップは完了済みとしてお話を進めます。APIを使ってデータを呼び出すので、Developer登録をしてゆく作業になります。すでにデータの可視化自体はウェザーステーションページからも確認が可能です。これぞ、Internet of Thingsの王道。

  1. Netatmo Developerに入ります。
  2. 右上のMy Accountからログインします。
  3. Create An Appをクリックして登録します。
  4. APIの名前をつけ、適当にメアドなども入力します。ロゴもつけられますよ。I accept…のチェックを入れて、SAVEボタンを押します。
  5. Technical Parameterのセクションでは、控えておいたリダイレクトURLを入れます。
  6. すでにこの段階で、Client IDとClient Secretが出来ているので、控えておきます。
  7. App StatusはActivate、そして、SAVEボタンを押します。

図;アプリ登録画面

ソースコード

GAS側ソースコード

OAuth認証用コード

  • Token取得用のエンドポイントは、https://api.netatmo.com/oauth2/tokenです。
  • OAuth認証用URLは、https://api.netatmo.com/oauth2/authorize?です。
  • 今回、スコープとしてはステーションのデータの読み取りのみを設定してるので、read_stationだけとなっています。

デバイスリストを返すコード

  • Netatmoのデータ取得エンドポイントURLはhttps://api.netatmo.com/api/getstationsdataとなります。リファレンスはこちら
  • 通常の外部の気象データも取得が可能で、その場合のエンドポイントURLはhttps://api.netatmo.com/api/getpublicdataとなります。リファレンスはこちら
  • Indoorの値(親機)と子機の値の取得方法はちょっと違うので注意!!
  • 今回は、デバイス名、デバイスID(あとで利用します)、取得できるデータタイプ(温度や二酸化炭素濃度など)を取得し、スプレッドシートに書き込みしています。

データの塊を取得してスプレッドシートに記述するコード

今回このデータの取得では、スクリプトトリガーを利用して、1時間に1度データを取得するようセットしてみました。APIで取得できるデータは最大1024ポイントです(scaleの指定がmaxの場合)。もちろん期間指定(UNIXタイムスタンプ)も可能です。

  • Netatmoの観測データ取得エンドポイントURLはhttps://api.netatmo.com/api/getmeasureとなります。リファレンスはこちら
  • 取得できるデータタイプは、Temperature, CO2, Humidity, Noise, Pressureの5種類(親機)。子機はNoiseとPressureはありません。また室外用子機はTemperatureとHumidityのみです。
  • 今回は30分単位、2018/11/08〜のデータとしてパラメータを構築しています。ただし、1リクエストに対して最大1024レコードまでしか取得できません。
  • 日付はUNIXタイムで返ってきます。また日付の指定もUNIXタイムでなければなりません。其のための相互変換用関数を利用させていただいています。
  • 複数のタイプの子機と親機が混在しているので、配列にて値を調整しています。
  • UrlfetchAppは10秒間隔で発行しないと、エラーとなるため、途中でスリープを10秒間入れています。

認証の実行と結果

スプレッドシートのメニューより、「セッティング」⇒「OAuth認証実行」をクリックすることで、ログイン認証画面が出てきます。Netatomoのサイトに飛び、YESを押すことで、Access Token他が手に入るようになります。

図:OAuth2認証画面が出てきます。

スプレッドシートメニューより、「Netatmo実行」⇒「直近全データ取得」でデータを取得します。といっても、2018/11/08で指定しているので、そこから最大1024ポイント、30分単位のデータが書き込まれます。

図:毎日取得しておけば、全データが揃います。

関連リンク

共有してみる: