solaredge 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fa7343187ab4b5ba7127ceaed020c9e25cc5ea56
4
+ data.tar.gz: 196ec1eb598270e502e773f2f8cff18f6839355f
5
+ SHA512:
6
+ metadata.gz: bc78b99da9a1b489fd1fb0b8e250d6adaefec23fe7504a9bae8b358d9f94cc216d24c04ce25a83ac3de63b1117205ac38246cfd5fc3b7609d0845f6655096a24
7
+ data.tar.gz: 2129a85b70b5148106a6b4f13c8649a219930793083e5904fb641c2f22a0a2b520e82cd9854521db34ff73c027eefba18d77f18d23668597ab9734c4f77704c5
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'The Energy Detective'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('lib/**/*.rb')
20
+ end
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ task :default => :rdoc
@@ -0,0 +1,71 @@
1
+ require 'json'
2
+ require 'net/http'
3
+
4
+ require 'openssl'
5
+
6
+ require 'solar_edge/sites'
7
+
8
+ module SolarEdge
9
+ class Client
10
+ def initialize(api_key)
11
+ @api_key = api_key
12
+ @host = URI.parse('https://monitoringapi.solaredge.com/')
13
+ @http = Net::HTTP.new(@host.host, @host.port)
14
+ @http.use_ssl = (@host.scheme == 'https')
15
+ @http.verify_mode = OpenSSL::SSL::VERIFY_PEER
16
+ end
17
+
18
+ def sites(search_text: nil, sort_by: nil, sort_order: nil)
19
+ raise ArgumentError, "invalid sort_by" if sort_by && !VALID_SORT_PROPERTIES.include?(sort_by)
20
+ raise ArgumentError, "sort_order must be specific with sort_by" if sort_order && !sort_by
21
+ raise ArgumentError, "sort_order must be :asc or :desc" if sort_order && !%i{asc desc}.include?(sort_order)
22
+
23
+ params = {}
24
+ params[:search_text] = search_text if search_text
25
+ params[:sort_property] = sort_by if sort_by
26
+ params[:sort_order] = sort_order if sort_order
27
+
28
+ # we cache the "all sites" query
29
+ if params.empty?
30
+ @sites ||= Sites.new(self, params)
31
+ else
32
+ Sites.new(self, params)
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ VALID_SORT_PROPERTIES = %i{
39
+ Name
40
+ Country
41
+ State
42
+ City
43
+ Address
44
+ Zip
45
+ Status
46
+ PeakPower
47
+ InstallationDate
48
+ Amount
49
+ MaxSeverity
50
+ CreationTime
51
+ }.freeze
52
+ private_constant :VALID_SORT_PROPERTIES
53
+
54
+ def query(path, params = {})
55
+ params = params.merge(api_key: @api_key)
56
+
57
+ uri = @host.merge(path)
58
+ uri.query = self.class.hash_to_query(params)
59
+
60
+ puts uri
61
+ get = Net::HTTP::Get.new(uri)
62
+ response = @http.request(get)
63
+ response.body
64
+ JSON.load(response.body)
65
+ end
66
+
67
+ def self.hash_to_query(hash)
68
+ hash.map{|k,v| "#{k}=#{v}" }.join("&")
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,32 @@
1
+ module SolarEdge
2
+ class Inverter
3
+ attr_reader :name, :manufacturer, :model, :serial_number
4
+
5
+ def initialize(site, name, manufacturer, model, serial_number)
6
+ @site, @name, @manufacturer, @model, @serial_number = site, name, manufacturer, model, serial_number
7
+ end
8
+
9
+ def data(start_time: @site.time_zone.now.beginning_of_day, end_time: @site.time_zone.now)
10
+ params = {}
11
+ params[:startTime] = start_time.in_time_zone(@site.time_zone).strftime('%Y-%m-%d %H:%M:%S')
12
+ params[:endTime] = end_time.in_time_zone(@site.time_zone).strftime('%Y-%m-%d %H:%M:%S')
13
+
14
+ @site.instance_variable_get(:@client).send(:query,
15
+ "/equipment/#{@site.id}/#{serial_number}/data", params)['data']['telemetries'].map do |value|
16
+ {
17
+ timestamp: @site.time_zone.parse(value['date']),
18
+ total_active_power: value['totalActivePower'],
19
+ dc_voltage: value['dcVoltage'],
20
+ ground_fault_resistance: value['groundFaultResistance'],
21
+ total_energy: value['totalEnergy'],
22
+ temperature: value['temperature'],
23
+ inverter_mode: value['inverterMode'].to_sym
24
+ }
25
+ end
26
+ end
27
+
28
+ def inspect
29
+ "#<SolarEdge::Inverter:#{serial_number} #{manufacturer} #{model} - #{name}>"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,71 @@
1
+ require 'active_support/time'
2
+
3
+ require 'solar_edge/inverter'
4
+
5
+ module SolarEdge
6
+ class Site
7
+ attr_reader :id
8
+
9
+ def initialize(client, id_or_details)
10
+ @client = client
11
+ if id_or_details.is_a?(Hash)
12
+ @details = id_or_details
13
+ @id = @details['id']
14
+ else
15
+ @id = id
16
+ end
17
+ end
18
+
19
+ def time_zone
20
+ @time_zone ||= ActiveSupport::TimeZone.new(details['location']['timeZone'])
21
+ end
22
+
23
+ def data_period
24
+ response = @client.send(:query, "/site/#{id}/dataPeriod")['dataPeriod']
25
+ time_zone.parse(response['startDate'])..time_zone.parse(response['endDate'])
26
+ end
27
+
28
+ def energy(resolution: :quarter_of_an_hour, start_date: time_zone.now, end_date: time_zone.now)
29
+ raise ArgumentError, "invalid resolution" unless %i{quarter_of_an_hour hour day week month year}.include?(resolution)
30
+ params = {}
31
+ params[:timeUnit] = resolution.to_s.upcase
32
+ params[:startDate] = start_date.to_date
33
+ params[:endDate] = end_date.to_date
34
+
35
+ @client.send(:query, "/site/#{id}/energy", params)['energy']['values'].map do |value|
36
+ {
37
+ timestamp: time_zone.parse(value['date']),
38
+ value: value['value']
39
+ }
40
+ end
41
+ end
42
+
43
+ def power(start_time: time_zone.now.beginning_of_day, end_time: time_zone.now)
44
+ params = {}
45
+ params[:startTime] = start_time.in_time_zone(time_zone).strftime('%Y-%m-%d %H:%M:%S')
46
+ params[:endTime] = end_time.in_time_zone(time_zone).strftime('%Y-%m-%d %H:%M:%S')
47
+
48
+ @client.send(:query, "/site/#{id}/power", params)['power']['values'].map do |value|
49
+ {
50
+ timestamp: time_zone.parse(value['date']),
51
+ value: value['value']
52
+ }
53
+ end
54
+ end
55
+
56
+ def inverters
57
+ @inverters ||= @client.send(:query, "/equipment/#{id}/list")['reporters']['list'].map do |inverter|
58
+ Inverter.new(self,
59
+ inverter['name'],
60
+ inverter['manufacturer'],
61
+ inverter['model'],
62
+ inverter['serialNumber'])
63
+ end
64
+ end
65
+ private
66
+
67
+ def details
68
+ @details ||= @client.send(:query, "/site/#{id}/details")
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,36 @@
1
+ require 'solar_edge/site'
2
+
3
+ module SolarEdge
4
+ class Sites
5
+ include Enumerable
6
+
7
+ def initialize(client, params)
8
+ @client, @params = client, params
9
+ end
10
+
11
+ def find(id)
12
+ Site.new(client, id)
13
+ end
14
+
15
+ def size
16
+ params = @params.dup
17
+ params[:size] = 1
18
+ @client.send(:query, '/sites/list', params)['sites']['count']
19
+ end
20
+
21
+ def each
22
+ params = @params.dup
23
+ params[:size] = 100
24
+ params[:startIndex] = 0
25
+ while true
26
+ sites = @client.send(:query, '/sites/list', params)['sites']
27
+ sites['site'].each do |site|
28
+ yield Site.new(@client, site)
29
+ end
30
+ break if sites['site'].length < params[:size] ||
31
+ params[:startIndex] + sites['site'].length == sites['count']
32
+ params[:startIndex] += sites['site'].length
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+ module SolarEdge
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1 @@
1
+ require 'solar_edge/client'
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solaredge
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Cody Cutrer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 10.4.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 10.4.2
41
+ description:
42
+ email:
43
+ - cody@cutrer.us
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - Rakefile
49
+ - lib/solar_edge/client.rb
50
+ - lib/solar_edge/inverter.rb
51
+ - lib/solar_edge/site.rb
52
+ - lib/solar_edge/sites.rb
53
+ - lib/solar_edge/version.rb
54
+ - lib/solaredge.rb
55
+ homepage: http://www.solaredge.com/
56
+ licenses:
57
+ - MIT
58
+ metadata: {}
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.1'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project:
75
+ rubygems_version: 2.4.5
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: Client library for talking to the SolarEdge monitoring API
79
+ test_files: []