egauge-rb 0.2.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +7 -7
- data/README.md +32 -28
- data/egauge-rb.gemspec +2 -2
- data/lib/egauge.rb +0 -2
- data/lib/egauge/client.rb +47 -6
- data/lib/egauge/version.rb +1 -1
- metadata +10 -12
- data/lib/egauge/power_helpers.rb +0 -21
- data/lib/egauge/response.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 870ff3fbd68b41a31cbe2f5569747a9bad1548f6155916eb7e8b6fae6e14c908
|
4
|
+
data.tar.gz: 83f121d4b91772be8f06b6df1a7ae86636bef65d86ccc1eebecf0b6220f1ea12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a24cfeee85d4adf9c3e77a9d5afff9d99cdb3f187e914a5d1e1ce3f55ae96a9a99c8f6f069230e43ec0dd0dd8ce352b129c2bac2c654256e42b844837f9b8076
|
7
|
+
data.tar.gz: 0063d5d9e63410339c912630930d07fed8bb154ae67e84dadfdc03f4e4242473cb16b33b009321d6561f6253cfe6eb1bd8e372046c2490a6f942863513c7f8db
|
data/Gemfile.lock
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
egauge-rb (
|
5
|
-
activesupport
|
4
|
+
egauge-rb (1.0.0)
|
5
|
+
activesupport (= 5.2.1)
|
6
6
|
httpclient
|
7
|
-
nokogiri
|
7
|
+
nokogiri (= 1.8.5)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
activesupport (5.1
|
12
|
+
activesupport (5.2.1)
|
13
13
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
14
14
|
i18n (>= 0.7, < 2)
|
15
15
|
minitest (~> 5.1)
|
@@ -18,12 +18,12 @@ GEM
|
|
18
18
|
concurrent-ruby (1.0.5)
|
19
19
|
diff-lcs (1.3)
|
20
20
|
httpclient (2.8.3)
|
21
|
-
i18n (1.
|
21
|
+
i18n (1.1.1)
|
22
22
|
concurrent-ruby (~> 1.0)
|
23
23
|
method_source (0.9.0)
|
24
24
|
mini_portile2 (2.3.0)
|
25
25
|
minitest (5.11.3)
|
26
|
-
nokogiri (1.8.
|
26
|
+
nokogiri (1.8.5)
|
27
27
|
mini_portile2 (~> 2.3.0)
|
28
28
|
pry (0.11.3)
|
29
29
|
coderay (~> 1.1.0)
|
@@ -57,4 +57,4 @@ DEPENDENCIES
|
|
57
57
|
rspec (~> 3.0)
|
58
58
|
|
59
59
|
BUNDLED WITH
|
60
|
-
1.16.
|
60
|
+
1.16.2
|
data/README.md
CHANGED
@@ -21,46 +21,50 @@ Or install it yourself as:
|
|
21
21
|
## Usage
|
22
22
|
Using this gem requires some understanding of the [Egauge API](https://www.egauge.net/docs/egauge-xml-api.pdf).
|
23
23
|
|
24
|
-
### Basic Query
|
25
|
-
Queries return response objects that can be interacted with. More details on the response object are found below.
|
26
24
|
```ruby
|
27
25
|
require 'egauge'
|
28
|
-
client = Egauge::Client.new('http
|
29
|
-
# This nil is necessary because the query structure is 'h&n=24'
|
30
|
-
client.query(:h => nil, :n => 24, :f => 1522800000)
|
26
|
+
client = Egauge::Client.new('http://<device_name>.egaug.es')
|
31
27
|
```
|
32
|
-
|
33
|
-
|
28
|
+
The Client object implements a `fetch` method which takes hash that needs these keys set:
|
29
|
+
- `:timestamp` [Timestamp] - This is the point in time
|
30
|
+
from which to fetch past readings. The "latest" reading
|
31
|
+
will be the beginning of the current period breakdown.
|
32
|
+
For instance, if the timestamp is `2018-10-20 13:06` and
|
33
|
+
the breakdown is hourly, the latest reading will be
|
34
|
+
from `2018-10-20 13:00`.
|
35
|
+
- `:breakdown` [Symbol] - This defines the time period
|
36
|
+
between the readings. This can be `:hour`, `:day` or `:month`.
|
37
|
+
- `:count` [Integer] - Number of past readings to fetch.
|
38
|
+
|
34
39
|
```ruby
|
35
|
-
|
36
|
-
|
37
|
-
|
40
|
+
options = {
|
41
|
+
:timestamp => 2018-10-26 21:47:23 -0400,
|
42
|
+
:breakdown => :hour,
|
43
|
+
:count => 3
|
44
|
+
}
|
45
|
+
client.fetch(options)
|
46
|
+
[
|
47
|
+
{"Date & Time"=>"1540602000", "Usage [kWh]"=>"0.000000000", "Generation [kWh]"=>"155625.220777500", "Solar [kWh]"=>"155625.220777500", "Solar+ [kWh]"=>"155707.304512778"},
|
48
|
+
{"Date & Time"=>"1540598400", "Usage [kWh]"=>"0.000000000", "Generation [kWh]"=>"155625.240751111", "Solar [kWh]"=>"155625.240751111", "Solar+ [kWh]"=>"155707.304512778"},
|
49
|
+
{"Date & Time"=>"1540594800", "Usage [kWh]"=>"0.000000000", "Generation [kWh]"=>"155625.262013333", "Solar [kWh]"=>"155625.262013333", "Solar+ [kWh]"=>"155707.304512778"}
|
50
|
+
]
|
38
51
|
```
|
39
52
|
|
40
|
-
|
41
|
-
Queries will return a response object. That object will have reader methods for each header that will return the rows of that header.
|
42
|
-
|
43
|
-
If you're unsure what your headers are, there is a method you can use to find out!
|
53
|
+
## Development
|
44
54
|
|
45
|
-
|
46
|
-
|
47
|
-
client = Egauge::Client.new('http://egaugeurl.egaug.es/12345')
|
48
|
-
response = client.query('cgi-bin/egauge-show', :h => nil, :n => 24, :f => 1522800000)
|
55
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
56
|
+
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
49
57
|
|
50
|
-
|
51
|
-
|
58
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
59
|
+
To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
52
60
|
|
53
|
-
|
54
|
-
=> [123412341234, 123412341234, 123412341234]
|
61
|
+
## Testing
|
55
62
|
|
63
|
+
`Rspec` is used as the testing framework. To test the whole suite, just run the following command.
|
64
|
+
```ruby
|
65
|
+
rake spec
|
56
66
|
```
|
57
67
|
|
58
|
-
## Development
|
59
|
-
|
60
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
61
|
-
|
62
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
63
|
-
|
64
68
|
## Contributing
|
65
69
|
|
66
70
|
Bug reports and pull requests are welcome on GitHub at https://github.com/ArcadiaPower/egauge-rb. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
data/egauge-rb.gemspec
CHANGED
@@ -21,8 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
23
|
spec.add_dependency "httpclient"
|
24
|
-
spec.add_dependency "nokogiri"
|
25
|
-
spec.add_dependency "activesupport"
|
24
|
+
spec.add_dependency "nokogiri", "1.8.5"
|
25
|
+
spec.add_dependency "activesupport", "5.2.1"
|
26
26
|
|
27
27
|
spec.add_development_dependency "bundler", "~> 1.16"
|
28
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
data/lib/egauge.rb
CHANGED
data/lib/egauge/client.rb
CHANGED
@@ -1,24 +1,65 @@
|
|
1
1
|
require 'httpclient'
|
2
|
+
require 'csv'
|
2
3
|
|
3
4
|
module Egauge
|
4
5
|
class Client
|
5
|
-
include Egauge::PowerHelpers
|
6
|
-
|
7
6
|
EGAUGE_PATH = '/cgi-bin/egauge-show?'.freeze
|
8
7
|
|
8
|
+
# The base_url should look something like
|
9
|
+
# this: 'http://egauge12345.egaug.es'
|
9
10
|
def initialize(base_url)
|
10
11
|
@client = HTTPClient.new(base_url: base_url)
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
# The options hash should have 3 keys defined:
|
15
|
+
# 1. :timestamp [Timestamp] - This is the point in time
|
16
|
+
# from which to fetch past readings. The "latest" reading
|
17
|
+
# will be the beginning of the current period breakdown.
|
18
|
+
# For instance if the timestamp is 2018-10-20 13:06 and
|
19
|
+
# the breakdown is hourly, the latest reading will be
|
20
|
+
# from 2018-10-20 13:00
|
21
|
+
# 2. :breakdown [Symbol] - This defines the time period
|
22
|
+
# between the readings. This can be :hour, :day or :month
|
23
|
+
# 3. :count [Integer] - Number of past readings to fetch
|
24
|
+
#
|
25
|
+
# This method returns an array of hashes with these values
|
26
|
+
# - "Date & Time" (An integer representing time since epoch)
|
27
|
+
# - "Usage [kWh]"
|
28
|
+
# - "Generation [kWh]"
|
29
|
+
# - "Solar [kWh]"
|
30
|
+
# - "Solar+ [kWh]"
|
31
|
+
def fetch(options)
|
32
|
+
timestamps = build_timestamps(options)
|
33
|
+
params = { T: timestamps.join(","), c: nil }
|
34
|
+
query(params)
|
15
35
|
end
|
16
36
|
|
17
37
|
private
|
18
38
|
attr_reader :client
|
19
39
|
|
20
|
-
def
|
21
|
-
|
40
|
+
def build_timestamps(options)
|
41
|
+
timestamp = options[:timestamp]
|
42
|
+
breakdown = options[:breakdown]
|
43
|
+
count = options[:count]
|
44
|
+
|
45
|
+
end_time = timestamp.send("beginning_of_#{breakdown}".to_sym)
|
46
|
+
time_method = "#{breakdown}s"
|
47
|
+
timestamps = []
|
48
|
+
count.times do |i|
|
49
|
+
timestamps << (end_time - i.send(time_method)).to_i
|
50
|
+
end
|
51
|
+
timestamps
|
52
|
+
end
|
53
|
+
|
54
|
+
def query(params)
|
55
|
+
csv_str = client.get(EGAUGE_PATH + query_string(params)).body
|
56
|
+
records = []
|
57
|
+
CSV.parse(csv_str, headers: true){|l| records << l.to_h }
|
58
|
+
records
|
59
|
+
end
|
60
|
+
|
61
|
+
def query_string(params)
|
62
|
+
params.stringify_keys.map do |key, value|
|
22
63
|
query_parameter = key.dup
|
23
64
|
query_parameter << "=#{value.to_s}" unless value.nil?
|
24
65
|
query_parameter
|
data/lib/egauge/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: egauge-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joey Ferguson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|
@@ -28,30 +28,30 @@ dependencies:
|
|
28
28
|
name: nokogiri
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.8.5
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.8.5
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activesupport
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 5.2.1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 5.2.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,8 +129,6 @@ files:
|
|
129
129
|
- egauge-rb.gemspec
|
130
130
|
- lib/egauge.rb
|
131
131
|
- lib/egauge/client.rb
|
132
|
-
- lib/egauge/power_helpers.rb
|
133
|
-
- lib/egauge/response.rb
|
134
132
|
- lib/egauge/version.rb
|
135
133
|
homepage: https://github.com/ArcadiaPower/egauge-rb
|
136
134
|
licenses:
|
data/lib/egauge/power_helpers.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Egauge
|
2
|
-
module PowerHelpers
|
3
|
-
KWH_DIVIDER = 3600000
|
4
|
-
|
5
|
-
def full_day_kwh(day = Time.zone.now.end_of_day.to_i)
|
6
|
-
query(:C => nil, :h => nil, :n => 24, :f => day)
|
7
|
-
end
|
8
|
-
|
9
|
-
def monthly_kwh(number_of_months = 12)
|
10
|
-
query(:C => nil, :T => months(number_of_months))
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def months(number_of_months)
|
16
|
-
number_of_months.times.map do |number|
|
17
|
-
number.months.ago.beginning_of_month.to_i
|
18
|
-
end.unshift(Time.current.to_i).join(',')
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/egauge/response.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
|
3
|
-
module Egauge
|
4
|
-
class Response
|
5
|
-
KWH_DIVIDER = 3600000
|
6
|
-
|
7
|
-
def initialize(body)
|
8
|
-
@body = Nokogiri.parse(body)
|
9
|
-
load_power_output
|
10
|
-
end
|
11
|
-
|
12
|
-
def headers
|
13
|
-
@_headers ||= body.css("cname").map { |header| header.text.downcase.gsub(/\W/,"_") }
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
attr_reader :body
|
19
|
-
|
20
|
-
def column_content(header_index)
|
21
|
-
rows.map { |row| (row.css("c").children[header_index].text.to_i / KWH_DIVIDER).abs }
|
22
|
-
end
|
23
|
-
|
24
|
-
def rows
|
25
|
-
@_rows ||= body.css("r")
|
26
|
-
end
|
27
|
-
|
28
|
-
def load_power_output
|
29
|
-
headers.each_with_index do |header, index|
|
30
|
-
self.class.send(:define_method, header) { column_content(index) }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|