LoginSignup
3
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-24

農業で使われる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
3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6