農業で使われるIOT機器のNetatmoウェザーステーションのAPIを呼び出してみます。
SDKが用意されてはいますが言語が限られていますので、curlで呼び出せることを確認してからrailsで呼び出すサンプルを記載します。
どのようなAPIがあるのかはNetatmo APIリファレンスを参照します。
今回はgetstationsdataという、ステーションが観測している現在の温度・湿度・気圧といった情報を取り出すAPIを呼び出してみます。
呼び出しフロー
- Netatmo ConnectからClient IDとClient Secretを取得(1回のみ実施)
- token取得APIを呼び出してaccess_tokenを取得
- access_tokenを使用してAPIを呼び出す
困ったらこちらを参照してください。Tutorials
Netatmo Connectへの登録
CREATE YOUR APPのページからアプリケーションを登録します。
App name(globalに一意)とDescriptionは必須項目です。
登録が完了すると、Client IDとClient Secretが発行されます。
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を指定します。
grant_typeにpasswordを指定した場合、ログインIDとログインパスワードをそのまま指定することになるので、怖いですよね...
ダイアログ形式での認証方式が用意されているようなので、本番運用などはそちらを使う方がよいかと思いますが、今回はさくっと呼び出す重視で進めます。
ステーションの観測データを取得
取得したaccess_tokenの値を使って、getstationsdata APIを呼び出します。
curlだと以下のようになります。
curl -X GET "https://api.netatmo.com/api/getstationsdata?access_token=XXXXXXXXXXXXXXXXXX"
Advanced REST Clientだとこのようになります。
Ruby on Railsでのサンプル
Controllerにベタ書きすると、このようになります。
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