おんどとりWeb StorageからRubyで現在値データを取得する

おんどとりWeb StorageはAPIが公開されているので、任意のプログラムから登録してある機器のデータを取得する事ができます。
Rubyで最新の温度データを取得するには以下のようにします。

データ取得するためのgemを作成しましたondotori-ruby-client

事前準備

  • API Keyの取得
  • 読み取り専用アカウントを作成する
  • APIのアクセス情報を/var/tmp/webstorage.jsonに記載する

アクセス情報はjson形式の外部ファイルから読み込む仕様にしました。

Key 説明
api_key API Key
user_id WebStorageのアカウントID
user_pass WebStorageのアカウントパスワード

アカウントIDとパスワードは読み取り専用アカウントを作成することをオススメします。

サンプルコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
 
require 'net/http'
require 'uri'
require 'json'
 
# WebStorageのアクセスURI
 
# WebStorageへの認証情報のファイルパス
WEB_STORAGE_ACCESS_INFO_PATH = "/var/tmp/webstorage.json"
=begin
認証情報はJSON形式
{
    "api_key":"おんどとりWebStorageから取得したAPI-KEY",
    "user_id" : "rbacxxxx",
    "user_pass" : "password"
}
=end
 
# WebStorage APIにアクセスするための情報をファイルから読み込みます
def load_webstorage_settings()
  begin
    File.open(WEB_STORAGE_ACCESS_INFO_PATH) do |file|
      storage_info = file.read
      load_info = JSON.parse(storage_info)
 
      # 読み込んだ情報をWSS APIのKeyにコンバート
      wss_access_info = {}
      wss_access_info["api-key"]    = load_info["api_key"]
      wss_access_info["login-id"]   = load_info["user_id"]
      wss_access_info["login-pass"] = load_info["user_pass"]
      return wss_access_info
    end
  rescue SystemCallError => e
    puts %Q(class=[#{e.class}] message=[#{e.message}])
  rescue IOError => e
    puts %Q(class=[#{e.class}] message=[#{e.message}])
  end
end
 
# 現在値データを取得します
def get_current_data()
  begin
    # 接続パラメータを読み込み
    params = load_webstorage_settings()
    if params.nil? then
      return nil
    end
 
    uri = URI.parse(WEB_STORAGE_URI)
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = uri.scheme === "https"
    headers = { "Content-Type" => "application/json", "X-HTTP-Method-Override" => "GET" }
    response = http.post(uri.path, params.to_json, headers)
 
    case response
    when Net::HTTPSuccess
      json = response.body
      return JSON.parse(json)
    else
      puts [uri.to_s, response.value].join(" : ")
    end
 
  rescue Net::HTTPBadResponse => e
    puts "Bad Response #{e}"
  rescue Net::HTTPHeaderSyntaxError => e
    puts "Header Syntax Error #{e}"
  rescue Net::HTTPClientException => e
    puts "Client Exception #{e}"
  rescue Net::HTTPServerException => e
    puts "Server Exception #{e}"
  rescue Net::HTTPError => e
    puts "Error #{e}"
  rescue Net::HTTPFatalError => e
    puts "Fatal Error #{e}"
  rescue Net::HTTPRetriableError => e
    puts "Retriable Error #{e}"
  rescue => e
    puts [uri.to_s, e.class, e].join(" : ")
  end
 
 return nil
end
 
# __main__
 
current_data = get_current_data()
if current_data.nil? then
  return 1
end
 
# こんな感じで取得可能
puts current_data["devices"][0]

参考情報

0 件のコメント :

コメントを投稿