Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@sakusrai

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

More than 3 years have passed since last update.

農業で使われる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
5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
sakusrai

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?