renstar 0.1.3 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3651f4b220453c1382ee4accc5503a1122364672acee6590366adcfe0bc911c9
4
- data.tar.gz: 7355ee293bca9e280004a799198c107c060c555dfff9913215c757d678ef67cc
3
+ metadata.gz: 6e0023780425b4b2d649ffaaf881630adb1485a8c54e58934f69c31ba4953bd5
4
+ data.tar.gz: ebbef10e2b31c0c51aa5de4c8b02b82ec6f5d29be6d4526f4ec15c5cbdffde62
5
5
  SHA512:
6
- metadata.gz: d216511fa715d06164f923d0d923312d7c515f7c97f9395bb91fa90dec0cbc416fbcc935e338d4b08b20f518236a4a3bc55a8766d470c1b2a501fedb1ee67884
7
- data.tar.gz: 56077d08ddc62d53d365999ac75fe552aeb8cf52222f97b3ba8fe4ce5de9a9ebc0f04546803fbb9df422ae51187bff0cc20ae30e682dbdfb3f2bce6cc647df14
6
+ metadata.gz: d36ebe45f2767dc4ed9f45f1299828004985fffe6c790913e5a1fad386ba23a59fd25347bb746ce0a2f9d8a88a448c952bfa707d77cfed9522e131477fc6f968
7
+ data.tar.gz: 4ae3c1982c6df2f82e05f45410002259df1a8c21113039dc4d9d4b2484819d432e2584109eb72683a3684e46d55519fe79b3342047904a32c68c7dae5c97db9f
data/Gemfile CHANGED
@@ -6,3 +6,4 @@ source 'https://rubygems.org'
6
6
  gemspec
7
7
 
8
8
  gem 'rake', '~> 13.0'
9
+ gem 'ssdp', git: 'https://github.com/mikerodrigues/ssdp'
data/README.md CHANGED
@@ -20,13 +20,69 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install renstar
22
22
 
23
- ## Usage
23
+ ## Using the included binary
24
+
25
+ When installing the gem, we install `renstar.rb` for you automatically. You can
26
+ pass the `-h` flag for more info.
27
+
28
+ The help page does not list all the accepted commands or their values but all of
29
+ the methods below are supported. The binary just passes your arguments to the
30
+ methods below.
31
+
32
+ So, if you want to cool your house to 72 using the binary, you can do this:
33
+ ```ruby
34
+ renstar.rb cool 72
35
+ ```
36
+
37
+ You can apply the logic above to any of the methods below for the same effect.
38
+
39
+ The binary chooses the first thermostat it finds on the network, so you may get
40
+ unexpected results if you have more than one on your network. I do plan on
41
+ improving this.
42
+
43
+ You may have trouble with discovery on multi-homed hosts, but I'm working with
44
+ the author of the `ssdp` library to fix this, so I expect it to improve. You can
45
+ install my fork of `ssdp` from github if you need multi-homed support now.
46
+
47
+ ## Using the library
48
+
49
+ First we need to create a `Thermostat` object.
24
50
 
25
51
  * Search for thermostats on the LAN, return the first one found:
26
52
  ```ruby
27
53
  thermo = Renstar::Thermostat.search.first
28
54
  ```
29
55
 
56
+ ### Query
57
+
58
+ These methods let you see the thermostat info (controls and settings status), sensor info, runtimes, and
59
+ alerts.
60
+
61
+ * Get information about the thermostat:
62
+ ```ruby
63
+ thermo.info
64
+ ```
65
+
66
+ * Get the current sensors and their readings:
67
+ ```ruby
68
+ thermo.sensors
69
+ ```
70
+
71
+ * Get runtimes:
72
+ ```ruby
73
+ thermo.runtimes
74
+ ```
75
+
76
+ * See alerts and their status:
77
+ ```ruby
78
+ thermo.alerts
79
+
80
+
81
+ ### Control
82
+
83
+ These methods let you control the thermostat temperature controls, and fan. You
84
+ can use the `info` method to check the current state of these controls.
85
+
30
86
  * Heat to 80 degrees:
31
87
  ```ruby
32
88
  thermo.heat(80)
@@ -42,7 +98,7 @@ thermo.cool(60)
42
98
  thermo.auto(70, 74)
43
99
  ```
44
100
 
45
- * Turn off heeating and/or cooling
101
+ * Turn off heating and/or cooling
46
102
  ```ruby
47
103
  thermo.off
48
104
  ```
@@ -56,11 +112,17 @@ thermo.fan_off
56
112
  thermo.fan_toggle
57
113
  ```
58
114
 
59
- * Control the schedule:
115
+ ### Settings
116
+
117
+ These methods let you change the schedule and vacation settings on your
118
+ thermostat. You can use the `info` method to check the current state of the
119
+ settings.
120
+
121
+ * Set the schedule:
60
122
  ```ruby
61
123
  thermo.schedule_on
62
124
 
63
- thermo.scheduel_off
125
+ thermo.schedule_off
64
126
 
65
127
  thermo.schedule_toggle
66
128
  ```
@@ -72,8 +134,6 @@ thermo.home
72
134
  thermo.away
73
135
  ```
74
136
 
75
-
76
-
77
137
  ## Development
78
138
 
79
139
  After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/bin/renstar.rb CHANGED
@@ -1,50 +1,51 @@
1
1
  require 'renstar'
2
2
  require 'optparse'
3
3
  require 'ostruct'
4
+ require 'pry'
4
5
 
5
- class RenstarOptions
6
- DEFAULT_OPTIONS = { all: false }.freeze
7
- USAGE = " Usage: renstar.rb command [value]"
6
+ options = {}
8
7
 
9
- def self.parse(args)
8
+ #DEFAULT_OPTIONS = { all: false }.freeze
10
9
 
11
- @options = OpenStruct.new(DEFAULT_OPTIONS)
12
10
 
13
- options = OptionParser.new do |opts|
14
- opts.banner = USAGE
11
+ USAGE = " Usage: renstar.rb command [value]"
15
12
 
16
- opts.on '-d', '--discover', 'Discover all Renstar devices' do |d|
17
- @options.discover = true
18
- end
13
+ OptionParser.new do |opts|
19
14
 
20
- opts.on '-h', '--help', 'Display this screen' do |h|
21
- @options.help = true
22
- end
23
- end
15
+ opts.banner = USAGE
24
16
 
25
- options.parse!(args)
26
-
27
- puts options if @options && ARGV == []
28
-
29
- if @options.discover
30
- Renstar.discover.each do |device|
31
- puts "#{device.name} #{device.ip}"
32
- end
33
- exit 0
34
- end
35
-
36
- if @options.help
37
- puts opts
38
- exit 0
39
- end
17
+ opts.on '-d', '--discover', 'Discover all Renstar devices' do |d|
18
+ options[:discover] = true
19
+ end
40
20
 
21
+ opts.on '-h', '--help', 'Display this screen' do |h|
22
+ puts opts
23
+ exit 0
24
+ end
25
+ end.parse!
41
26
 
27
+ if options[:discover]
28
+ thermos = Renstar::Thermostat.search
29
+ thermos.each do |thermo|
30
+ puts "Found: #{thermo.location} #{thermo.usn}"
42
31
  end
32
+ exit 0
43
33
  end
44
34
 
45
- @options = RenstarOptions.parse(ARGV)
46
35
 
47
- thermo = Renstar::Thermostat.search.first
48
-
49
-
50
- thermo.send(*ARGV)
36
+ thermos = Renstar::Thermostat.search
37
+ thermos.each do |thermo|
38
+ puts "Found: #{thermo.location} #{thermo.usn}"
39
+ end
40
+ puts "Using: " + thermos.first.location + " - " + thermos.first.usn
41
+ unless (ARGV.nil? || ARGV.empty?)
42
+ response = thermos.first.send(*ARGV)
43
+ case response
44
+ when String
45
+ puts response
46
+ when Renstar::APIClient::APIObject
47
+ response.pp
48
+ when Array
49
+ response.each {|x| x.pp }
50
+ end
51
+ end
@@ -23,18 +23,15 @@ module Renstar
23
23
  @raw_hash
24
24
  end
25
25
 
26
- def human_readable
26
+ def human_readable(type)
27
27
  @raw_hash.map do |key, value|
28
- description = APIClient.key_to_description('runtimes', key)
29
- formatted_value = APIClient.value_to_formatted('runtimes', key, value)
28
+ description = APIClient.key_to_description(type, key)
29
+ formatted_value = APIClient.value_to_formatted(type, key, value)
30
30
  format("%-35<description>s %<formatted_value>s\n",
31
31
  { description: description, formatted_value: formatted_value })
32
32
  end.join
33
33
  end
34
34
 
35
- def pp
36
- puts human_readable
37
- end
38
35
  end
39
36
  end
40
37
  end
@@ -8,6 +8,9 @@ module Renstar
8
8
  # These alerts are for Air filter, Service, and UV Lamp
9
9
  #
10
10
  class Alert < APIObject
11
+ def pp
12
+ puts human_readable('alerts')
13
+ end
11
14
  end
12
15
  end
13
16
  end
@@ -9,6 +9,9 @@ module Renstar
9
9
  # info response from the API for clean access.
10
10
  #
11
11
  class Info < APIObject
12
+ def pp
13
+ puts human_readable('info')
14
+ end
12
15
  end
13
16
  end
14
17
  end
@@ -8,6 +8,9 @@ module Renstar
8
8
  # Breaks down how much time the system spent in various states
9
9
  # like heating or cooling.
10
10
  class Runtime < APIObject
11
+ def pp
12
+ puts human_readable('runtimes')
13
+ end
11
14
  end
12
15
  end
13
16
  end
@@ -7,6 +7,9 @@ module Renstar
7
7
  # Represents an installed sensor in the system
8
8
  # Returns the value of the sensor
9
9
  class Sensor < APIObject
10
+ def pp
11
+ puts human_readable('sensors')
12
+ end
10
13
  end
11
14
  end
12
15
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'ssdp'
4
+ require 'socket'
4
5
  require_relative 'api_client'
5
6
 
6
7
  module Renstar
@@ -11,27 +12,42 @@ module Renstar
11
12
  #
12
13
  class Thermostat
13
14
  SERVICE = 'venstar:thermostat:ecp'
14
- DEFAULT_TIMEOUT = 5
15
+ DEFAULT_TIMEOUT = 3
15
16
 
16
17
  attr_reader :location, :usn, :cached_info
17
18
 
18
19
  include APIClient
19
20
 
20
- def initialize(location, usn)
21
- @location = location
22
- @usn = usn
21
+ def initialize(location, usn = nil)
22
+ if location && usn then
23
+ @location = location
24
+ @usn = usn
25
+ else
26
+ @location = "http://" + location + '/'
27
+ @usn = ""
28
+ end
29
+
23
30
  @cache_timestamp = Time.now
24
31
  @cached_info = info
25
32
  end
26
33
 
27
34
  def self.search(timeout = DEFAULT_TIMEOUT)
28
- ssdp = SSDP::Consumer.new
29
- thermos = ssdp.search(service: SERVICE, timeout: timeout)
30
- thermos.map do |thermo|
31
- location = thermo[:params]['Location']
32
- usn = thermo[:params]['USN']
33
- Renstar::Thermostat.new(location, usn)
35
+ all_thermos = []
36
+ ips = Socket.ip_address_list.select do |ip|
37
+ ip.ipv4? &&
38
+ !ip.ipv4_loopback?
39
+ end
40
+ ips.each do |ip|
41
+ puts "Searching subnet associated with #{ip.ip_address}"
42
+ ssdp = SSDP::Consumer.new({bind: ip.ip_address})
43
+ thermos = ssdp.search(service: SERVICE, timeout: timeout)
44
+ thermos.each do |thermo|
45
+ location = thermo[:params]['Location']
46
+ usn = thermo[:params]['USN']
47
+ all_thermos << Renstar::Thermostat.new(location, usn)
48
+ end
34
49
  end
50
+ all_thermos
35
51
  end
36
52
 
37
53
  def update
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Renstar
4
- VERSION = '0.1.3'
4
+ VERSION = '0.3.0'
5
5
  end
data/renstar.gemspec CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.require_paths = ['lib']
30
30
 
31
31
  spec.add_runtime_dependency 'json'
32
- spec.add_runtime_dependency 'ssdp'
32
+ spec.add_runtime_dependency 'ssdp', '~> 1.1.7'
33
33
 
34
34
  # Uncomment to register a new dependency of your gem
35
35
  # spec.add_dependency "example-gem", "~> 1.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: renstar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Rodrigues
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-21 00:00:00.000000000 Z
11
+ date: 2022-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: ssdp
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 1.1.7
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: '0'
40
+ version: 1.1.7
41
41
  description: Control Venstar thermostats with Ruby via their local API.
42
42
  email:
43
43
  - mikebrodrigues@gmail.com
@@ -50,7 +50,6 @@ extra_rdoc_files: []
50
50
  files:
51
51
  - ".gitignore"
52
52
  - Gemfile
53
- - Gemfile.lock
54
53
  - LICENSE
55
54
  - README.md
56
55
  - Rakefile
@@ -92,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
91
  - !ruby/object:Gem::Version
93
92
  version: '0'
94
93
  requirements: []
95
- rubygems_version: 3.2.22
94
+ rubygems_version: 3.2.33
96
95
  signing_key:
97
96
  specification_version: 4
98
97
  summary: Control Venstar thermostats.
data/Gemfile.lock DELETED
@@ -1,23 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- renstar (0.1.1)
5
- json
6
- ssdp
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- json (2.6.1)
12
- rake (13.0.6)
13
- ssdp (1.1.7)
14
-
15
- PLATFORMS
16
- x86_64-linux
17
-
18
- DEPENDENCIES
19
- rake (~> 13.0)
20
- renstar!
21
-
22
- BUNDLED WITH
23
- 2.2.22