NetatmoウェザーステーションAPIをさくっと呼び出す

農業で使われるIOT機器のNetatmoウェザーステーションのAPIを呼び出してみます。
SDKが用意されてはいますが言語が限られていますので、curlで呼び出せることを確認してからrailsで呼び出すサンプルを記載します。

どのようなAPIがあるのかは[Netatmo APIリファレンス](https://dev.netatmo.com/en-US/resources/technical/reference)を参照します。
今回は[getstationsdata](https://dev.netatmo.com/en-US/resources/technical/reference/weatherstation/getstationsdata)という、ステーションが観測している現在の温度・湿度・気圧といった情報を取り出すAPIを呼び出してみます。

# 呼び出しフロー
1. Netatmo ConnectからClient IDとClient Secretを取得（1回のみ実施）
1. token取得APIを呼び出してaccess_tokenを取得
1. access_tokenを使用してAPIを呼び出す

困ったらこちらを参照してください。[Tutorials](https://dev.netatmo.com/en-US/resources/technical/samplessdks/tutorials)

## Netatmo Connectへの登録

[CREATE YOUR APP](https://dev.netatmo.com/myaccount/createanapp)のページからアプリケーションを登録します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/106949/d581e940-dc8c-7265-6fc2-dd7b6193ce56.png)

App name（globalに一意）とDescriptionは必須項目です。

登録が完了すると、Client IDとClient Secretが発行されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/106949/b13e8a57-3720-fdbc-d7da-9ec343677ef2.png)

## token取得

認証まわりのドキュメントは[authentication](https://dev.netatmo.com/en-US/resources/technical/guides/authentication)のページにまとまっています。
https://api.netatmo.com/oauth2/token というエンドポイントに対して、URLエンコードされたパラメータをPOSTで送信します。
curlだと以下のようになります。
JSON形式でレスポンスが返却されます。

```
$ curl -X POST https://api.netatmo.com/oauth2/token -d "grant_type=password&client_id=XXXXXXXXXX&client_secret=XXXXXXXXXXXXX&username=example@example.com&password=XXXX"
```

curlを叩けない方は、Chrome拡張の[Advanced REST Client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo)を使うと楽かと思います。
以下のように指定してみてください。
content-typeにapplication/x-www-form-urlencodedを指定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/106949/ae557118-2f72-1b28-ec19-a9c683862982.png)

grant_typeにpasswordを指定した場合、ログインIDとログインパスワードをそのまま指定することになるので、怖いですよね...
[ダイアログ形式での認証方式](https://dev.netatmo.com/en-US/resources/technical/guides/authentication/authorizationcode)が用意されているようなので、本番運用などはそちらを使う方がよいかと思いますが、今回はさくっと呼び出す重視で進めます。


## ステーションの観測データを取得

取得したaccess_tokenの値を使って、getstationsdata APIを呼び出します。
curlだと以下のようになります。

```
curl -X GET "https://api.netatmo.com/api/getstationsdata?access_token=XXXXXXXXXXXXXXXXXX"
```

Advanced REST Clientだとこのようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/106949/b3bbe1d8-e92e-8566-3142-8fa550bd1f01.png)

# Ruby on Railsでのサンプル

Controllerにベタ書きすると、このようになります。

```ruby:netatomoapis_controller.rb
class NetatmoapisController < ApplicationController
  require 'net/https'
  require 'uri'

  def index
    # token取得APIを呼び出す
    tokenUri = URI.parse("https://api.netatmo.com/oauth2/token")
    tokenReq = Net::HTTP::Post.new(tokenUri.path)
    tokenReq.set_form_data({
      "grant_type" => "password",
      "username" => "example@example.com",
      "password" => "XXXXXXXX",
      "client_id" => "XXXXXXXXXXXXXXXXXXXXXX",
      "client_secret" => "XXXXXXXXXXXXXXXXXXXXXX"
    })
    http = Net::HTTP.new(tokenUri.host, tokenUri.port)
    http.use_ssl = true
    http.start()
    tokenRes = http.request(tokenReq)

    # レスポンスからaccess_tokenを取得する
    token = JSON.parse(tokenRes.body)
    access_token = token["access_token"]

    # ステーションのデータを取得する
    stationReq = Net::HTTP::Get.new("https://api.netatmo.com/api/getstationsdata?access_token=" + access_token)
    stationRes = http.request(stationReq)
    @data = JSON.parse(stationRes.body)
  end
end
```