solarium 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d0c5c4f5db3d02c348ed02e9b9ba42629372c598
4
+ data.tar.gz: 437ee53bb835aa18834057fc8ca2f0ba72ed52bd
5
+ SHA512:
6
+ metadata.gz: 8ca7ba6a541d4ee16612e006ef10f4df1f047bf93bf74761042b5ca738891c3821d07732aba4d85d35fc93b48943ac58e285170f48fadabb2d4e42123179ff6f
7
+ data.tar.gz: 7f4d02d5ed1658045d82cadbf07b20efcbf3c3c27810e31b046b07479075fbaee2c9c730ade15517c2a83f0c409285bc30e45eb1894e906d4684e0aeca42584a
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+ # Solarium (C) 2017 Peter "SaberUK" Powell <petpow@saberuk.com>
3
+
4
+ APP_ROOT = File.dirname __dir__
5
+ if Dir.exist? "#{APP_ROOT}/.git"
6
+ $LOAD_PATH.unshift "#{APP_ROOT}/lib"
7
+ end
8
+
9
+ %w(solarium trollop).each do |lib|
10
+ begin
11
+ require lib
12
+ rescue ::Exception => error
13
+ STDERR.puts "A fatal error was encountered whilst loading #{lib}:"
14
+ STDERR.puts "#{error.class}: #{error.message}"
15
+ exit 1
16
+ end
17
+ end
18
+
19
+ APP_NAME = File.basename $PROGRAM_NAME
20
+ options = Trollop::options do
21
+ banner "Usage: #{APP_NAME} [OPTIONS]"
22
+ version Solarium::VERSION
23
+
24
+ opt :database_url, 'The URL for connecting to the SQL database', default: 'sqlite://production.sq3'
25
+ opt :envoy_url, 'The URL of the Envoy web interface', default: 'http://192.168.1.200/'
26
+ opt :print_stats, 'Print generation statistics after collection', default: false
27
+ end
28
+
29
+ Trollop::die :database_url, 'is not a valid URL' unless options[:database_url] =~ /^#{URI.regexp}$/
30
+ Trollop::die :envoy_url, 'is not a valid URL' unless options[:envoy_url] =~ /^#{URI.regexp}$/
31
+
32
+ collector = Solarium::Collector.new options[:envoy_url]
33
+ unless collector.error.nil?
34
+ STDERR.puts "A fatal error was encountered whilst collecting data:"
35
+ STDERR.puts "#{collector.error.class}: #{collector.error.message}"
36
+ exit 1
37
+ end
38
+
39
+ if options[:print_stats]
40
+ puts <<~STATISTICS
41
+ == Generation Statistics ==
42
+ Currently: #{collector.now} watts
43
+ Today: #{collector.today} watt hours
44
+ Past Week: #{collector.week} watt hours
45
+ Since Installation: #{collector.lifetime} watt hours
46
+ STATISTICS
47
+ end
48
+
49
+ database = Solarium::Database.new options[:database_url]
50
+ unless database.error.nil?
51
+ STDERR.puts "A fatal error was encountered whilst connecting to the database:"
52
+ STDERR.puts "#{database.error.class}: #{database.error.message}"
53
+ exit 1
54
+ end
55
+ database.insert collector
@@ -0,0 +1,48 @@
1
+ # Solarium (C) 2017 Peter "SaberUK" Powell <petpow@saberuk.com>
2
+
3
+ module Solarium
4
+
5
+ # Public: Collects generation information from the Envoy API.
6
+ class Collector
7
+
8
+ # Public: Either an exception that was thrown during collection or nil.
9
+ attr_reader :error
10
+
11
+ # Public: The number of watt hours which have been generated since the system was installed.
12
+ attr_reader :lifetime
13
+
14
+ # Public: The number of watts currently being generated.
15
+ attr_reader :now
16
+
17
+ # Public: The number of watt hours which have been generated today.
18
+ attr_reader :today
19
+
20
+ # Public: The number of watt hours which have been generated in the last week.
21
+ attr_reader :week
22
+
23
+ # Public: Initializes a new instance of the Solarium::Collector class.
24
+ #
25
+ # url - The URL of the Envoy web interface.
26
+ def initialize url
27
+ collect url
28
+ rescue ::Exception => error
29
+ @error = error
30
+ end
31
+
32
+ # Internal: Collects generation information from the Envoy API.
33
+ #
34
+ # url - The URL of the Envoy web interface.
35
+ private def collect url
36
+ uri = URI.parse url
37
+ uri.path = '/api/v1/production'
38
+
39
+ body = open(uri).read
40
+ json = JSON.parse body
41
+
42
+ @now = json['wattsNow']
43
+ @today = json['wattHoursToday']
44
+ @week = json['wattHoursSevenDays']
45
+ @lifetime = json['wattHoursLifetime']
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,49 @@
1
+ # Solarium (C) 2017 Peter "SaberUK" Powell <petpow@saberuk.com>
2
+
3
+ module Solarium
4
+
5
+ # Public: Implements logic for interacting with the Solarium database.
6
+ class Database
7
+
8
+ # Public: Either an exception that was thrown during database connection or nil.
9
+ attr_reader :error
10
+
11
+ # Public: Initializes a new instance of the Solarium::Database class.
12
+ #
13
+ # url - The URL for connecting to the SQL database.
14
+ def initialize url
15
+ connect url
16
+ rescue ::Exception => error
17
+ @error = error
18
+ end
19
+
20
+ # Public: Stores the information provided by a Solarium::Collector in the database.
21
+ #
22
+ # collector - An instance of the Solarium::Collector class containing information to store.
23
+ def insert collector
24
+ row = {
25
+ time: DateTime.now,
26
+ now: collector.now,
27
+ today: collector.today,
28
+ week: collector.week,
29
+ lifetime: collector.lifetime
30
+ }
31
+ @connection[:solarium].insert row
32
+ end
33
+
34
+ # Internal: Connects to the database and creates the table if required.
35
+ #
36
+ # url - The URL for connecting to the SQL database.
37
+ private def connect url
38
+ @connection = Sequel.connect url
39
+ @connection.create_table? :solarium do
40
+ column :time, DateTime, primary_key: true
41
+ column :now, Integer, null: false
42
+ column :today, Integer, null: false
43
+ column :week, Integer, null: false
44
+ column :lifetime, Integer, null: false
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,23 @@
1
+ # Solarium (C) 2017 Peter "SaberUK" Powell <petpow@saberuk.com>
2
+
3
+ module Solarium
4
+
5
+ # Public: The version number which is incremented when compatibility is broken.
6
+ VERSION_MAJOR = 0
7
+
8
+ # Public: The version number which is incremented when new features are added.
9
+ VERSION_MINOR = 1
10
+
11
+ # Public: The version number which is incremented when bugs are fixed.
12
+ VERSION_PATCH = 0
13
+
14
+ # Public: The version label which describes the status of the build.
15
+ VERSION_LABEL = nil
16
+
17
+ # Public: A string which contains the current version.
18
+ VERSION = if VERSION_LABEL.nil?
19
+ "#{VERSION_MAJOR}.#{VERSION_MINOR}.#{VERSION_PATCH}"
20
+ else
21
+ "#{VERSION_MAJOR}.#{VERSION_MINOR}.#{VERSION_PATCH}-#{VERSION_LABEL}"
22
+ end
23
+ end
data/lib/solarium.rb ADDED
@@ -0,0 +1,10 @@
1
+ # Solarium (C) 2017 Peter "SaberUK" Powell <petpow@saberuk.com>
2
+
3
+ require 'json'
4
+ require 'open-uri'
5
+ require 'sequel'
6
+ require 'uri'
7
+
8
+ require_relative 'solarium/collector'
9
+ require_relative 'solarium/database'
10
+ require_relative 'solarium/version'
metadata ADDED
@@ -0,0 +1,144 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solarium
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter "SaberUK" Powell
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.1.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.1.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: sequel
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 5.1.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '5.1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 5.1.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: trollop
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.1'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 2.1.2
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.1'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 2.1.2
73
+ - !ruby/object:Gem::Dependency
74
+ name: rdoc
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '5.1'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 5.1.0
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '5.1'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 5.1.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: tomdoc
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: 0.2.5
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: 0.2.5
107
+ description: A tool for working with generation data collected from the Enphase Envoy
108
+ solar panel management system.
109
+ email: petpow@saberuk.com
110
+ executables:
111
+ - solarium-collect
112
+ extensions: []
113
+ extra_rdoc_files: []
114
+ files:
115
+ - bin/solarium-collect
116
+ - lib/solarium.rb
117
+ - lib/solarium/collector.rb
118
+ - lib/solarium/database.rb
119
+ - lib/solarium/version.rb
120
+ homepage: https://github.com/SaberUK/solarium
121
+ licenses:
122
+ - Apache-2.0
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 2.1.0
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubyforge_project:
140
+ rubygems_version: 2.6.13
141
+ signing_key:
142
+ specification_version: 4
143
+ summary: Enphase Envoy generation data manipulation tool.
144
+ test_files: []