Edited at

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

More than 1 year has 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