-
Notifications
You must be signed in to change notification settings - Fork 0
/
comgy_client.rb
78 lines (62 loc) · 1.89 KB
/
comgy_client.rb
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
require 'uri'
require 'faraday'
class ComgyClient
BASE_PATH = '/public/v0'
HOST = 'api.comgy.io'
def initialize(token)
@token = token
end
# @example
# [{:meter_identifier=>"19061274", :meter_mivd=>"DWZ-19061274-2-7", :value=>"0.096", :unit=>"m3"}]
def fetch_meter_readouts
meters = fetch_meters
meters.filter_map do |meter|
meter_value = fetch_meter_value(meter[:id])
next if meter_value.nil?
{
meter_identifier: meter[:identifier],
meter_mivd: meter[:mivd],
value: meter_value[:value],
unit: meter_value[:unit],
}
end
end
private
# @example
# [
# {:id=>"12313", :identifier=>"99191238", :mivd=>"DWZ-18061274-2-7"},
# {:id=>"12314", :identifier=>"77123919", :mivd=>"20124124"}
# ]
def fetch_meters
url = build_resource_url('meters')
response = Faraday.get(url, nil, headers)
payload = JSON.parse(response.body, symbolize_names: true)
payload[:data].map do |meter_resource|
{
id: meter_resource[:id],
**meter_resource[:attributes].slice(:id, :identifier, :mivd),
}
end
end
# @example
# {:value=>"0.096", :unit=>"m3"}
def fetch_meter_value(meter_id)
timestamp_yesterday = (Time.now - 86_400).strftime('%Y-%m-%dT%H:%M:%S.%L%z')
url = build_resource_url("meters/#{meter_id}/meter-values")
response = Faraday.get(url, { filter: { from: timestamp_yesterday } }, headers)
payload = JSON.parse(response.body, symbolize_names: true)
recent_value = payload[:data].max_by { |meter_value| meter_value[:attributes][:timestamp] }
recent_value.nil? ? nil : recent_value.fetch(:attributes).slice(:value, :unit)
end
def build_resource_url(path)
URI::HTTPS.build(
host: HOST,
path: [BASE_PATH, path].join('/')
).to_s
end
def headers
@headers ||= {
'Authorization' => "Bearer #{@token}"
}
end
end