api
netatmo

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

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

どのようなAPIがあるのかはNetatmo APIリファレンスを参照します。
今回はgetstationsdataという、ステーションが観測している現在の温度・湿度・気圧といった情報を取り出すAPIを呼び出してみます。

呼び出しフロー

  1. Netatmo ConnectからClient IDとClient Secretを取得(1回のみ実施)
  2. token取得APIを呼び出してaccess_tokenを取得
  3. access_tokenを使用してAPIを呼び出す

困ったらこちらを参照してください。Tutorials

Netatmo Connectへの登録

CREATE YOUR APPのページからアプリケーションを登録します。
image.png

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

登録が完了すると、Client IDとClient Secretが発行されます。
image.png

token取得

認証まわりのドキュメントは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を使うと楽かと思います。
以下のように指定してみてください。
content-typeにapplication/x-www-form-urlencodedを指定します。

image.png

grant_typeにpasswordを指定した場合、ログインIDとログインパスワードをそのまま指定することになるので、怖いですよね...
ダイアログ形式での認証方式が用意されているようなので、本番運用などはそちらを使う方がよいかと思いますが、今回はさくっと呼び出す重視で進めます。

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

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

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

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

image.png

Ruby on Railsでのサンプル

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

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